在R中使用strsplit的sapply()

时间:2015-07-05 21:28:20

标签: r strsplit

我找到了这段代码:

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

显然strsplit(string, ":")会返回大小为3的向量,其中每个组件i是包含GiE00i的大小为2的向量。

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

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

3 个答案:

答案 0 :(得分:5)

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

 sub('.*:', '', string)
 #[1] "E001" "E002" "E003"

关于您的代码,strsplit输出是一个列表,列表可以使用应用族函数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"

如果是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"

答案 1 :(得分:2)

因为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"

答案 2 :(得分:2)

查看?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

然后:

`[`(x, 2)      # equivalent to x[2]
# [1] "E001"

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