在R中使用strsplit的sapply()

Leo*_*rdo 3 r strsplit

我找到了这段代码:

string = c("G1:E001", "G2:E002", "G3:E003")
> sapply(strsplit(string, ":"), "[", 2)
[1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)

清楚地strsplit(string, ":")返回大小为3的向量,其中每个组件i是包含Gi和的大小为2的向量E00i.

但为什么另外两个论点"[", 2只能选择那些E00i?据我所知,函数接受的唯一参数是:

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

您可以使用sub获取预期输出而不是使用strsplit/sapply

 sub('.*:', '', string)
 #[1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)

关于你的代码,strsplit输出是一个列表,列表可以用apply系列函数sapply/lapply/vapply/rapply等处理.在这种情况下,每个列表元素的长度为2,我们选择第二个元素.

strsplit(string, ":")
#[[1]]
#[1] "G1"   "E001"

#[[2]]
#[1] "G2"   "E002"

#[[3]]
#[1] "G3"   "E003"

lapply(strsplit(string, ":"), `[`, 2)
#[[1]]
#[1] "E001"

#[[2]]
#[1] "E002"

#[[3]]
#[1] "E003"
Run Code Online (Sandbox Code Playgroud)

在这种情况下sapply,默认选项是simplify=TRUE

 sapply(strsplit(string, ":"), `[`, 2, simplify=FALSE)
#[[1]]
#[1] "E001"

#[[2]]
#[1] "E002"

#[[3]]
#[1] "E003"
Run Code Online (Sandbox Code Playgroud)

[可以通过匿名函数调用来代替

sapply(strsplit(string, ":"), function(x) x[2], simplify=FALSE)
#[[1]]
#[1] "E001"

#[[2]]
#[1] "E002"

#[[3]]
#[1] "E003"
Run Code Online (Sandbox Code Playgroud)

  • 它不仅是替代品,而且是等价物.`x [2]`与`\`[\`(x,2)`相同 (2认同)

Bro*_*ieG 3

查看文档?sapply

\n\n
 sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)\n\n FUN: the function to be applied to each element of \xe2\x80\x98X\xe2\x80\x99: see\n      \xe2\x80\x98Details\xe2\x80\x99.  In the case of functions like \xe2\x80\x98+\xe2\x80\x99, \xe2\x80\x98%*%\xe2\x80\x99, the\n      function name must be backquoted or quoted.\n\n ...: optional arguments to \xe2\x80\x98FUN\xe2\x80\x99.\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是你的答案。在你的情况下,FUN[. 在您的情况下, “可选参数fun”为“2”,因为它在您的调用中匹配...。因此,在本例中,sapply调用时将[列表中的值作为第一个参数,并将其2作为第二个参数。考虑:

\n\n
x <- c("G1", "E001")   # this is the result of `strsplit` on the first value\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后:

\n\n
`[`(x, 2)      # equivalent to x[2]\n# [1] "E001"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是sapply您的示例中正在做的事情,除了它应用于由返回的每个 2 长度字符向量strsplit

\n