sapply()与R中的strsplit

sapply()与R中的strsplit,r,strsplit,R,Strsplit,我发现这个代码: string = c("G1:E001", "G2:E002", "G3:E003") > sapply(strsplit(string, ":"), "[", 2) [1] "E001" "E002" "E003" 显然strsplit(string,“:”)返回大小为3的向量,其中每个分量i是大小为2的向量,包含Gi和E00i 但是,为什么另外两个参数“[”,2只能选择那些E00i?据我所知,函数只接受以下参数: sapply(X, FUN, ..., simpli

我发现这个代码:

string = c("G1:E001", "G2:E002", "G3:E003")
> sapply(strsplit(string, ":"), "[", 2)
[1] "E001" "E002" "E003"
显然
strsplit(string,“:”)
返回大小为3的向量,其中每个分量i是大小为2的向量,包含
Gi
E00i

但是,为什么另外两个参数
“[”,2
只能选择那些
E00i
?据我所知,函数只接受以下参数:

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 

因为
strsplit()
的输出是一个列表,“[”表示列表的元素,2表示选择了列表成员的第二项。
sapply()
函数确保为列表的每个成员执行此操作。
[
sapply()中的函数
,它应用于
strsplit()
的列表,并使用附加参数2调用

> strsplit(string, ":")
#[[1]]
#[1] "G1"   "E001"
#
#[[2]]
#[1] "G2"   "E002"
#
#[[3]]
#[1] "G3"   "E003"
#
> str(strsplit(string, ":"))
#List of 3
# $ : chr [1:2] "G1" "E001"
# $ : chr [1:2] "G2" "E002"
# $ : chr [1:2] "G3" "E003"

您可以使用
sub
来获得预期的输出,而不是使用
strsplit/sapply

 sub('.*:', '', string)
 #[1] "E001" "E002" "E003"
关于您的代码,
strsplit
输出是一个列表,可以使用apply系列函数
sappy/lappy/vapply/rappy
等处理列表。在这种情况下,每个列表元素的长度为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"
对于
sapply
,默认选项为
simplify=TRUE

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

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

#[[3]]
#[1] "E003"
[
可以替换为匿名函数调用

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

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

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

查看文档以了解
?sapply

 sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)

 FUN: the function to be applied to each element of ‘X’: see
      ‘Details’.  In the case of functions like ‘+’, ‘%*%’, the
      function name must be backquoted or quoted.

 ...: optional arguments to ‘FUN’.
答案就在这里。在你的例子中,
FUN
[
FUN
的可选参数在你的例子中是“2”,因为它在你的调用中与
匹配。所以在这个例子中,
sapply
正在调用
[
将列表中的值作为第一个参数,
2
作为第二个参数。考虑:

x <- c("G1", "E001")   # this is the result of `strsplit` on the first value

这就是
sapply
在您的示例中所做的,只是它应用于由
strsplit

返回的每2个长度的字符向量。它不仅是一个替换,它是一个等价物。
x[2]
`[`(x,2)
`[`(x, 2)      # equivalent to x[2]
# [1] "E001"