sapply() 在 R 中使用 strsplit
sapply() with strsplit in R
我找到了这段代码:
string = c("G1:E001", "G2:E002", "G3:E003")
> sapply(strsplit(string, ":"), "[", 2)
[1] "E001" "E002" "E003"
显然 strsplit(string, ":")
returns 一个大小为 3 的向量,其中每个分量 i 是一个大小为 2 的向量,包含 Gi
和 E00i
.
但是为什么另外两个参数 "[", 2
只对 select 那些 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
输出是一个列表,可以使用应用族函数 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"
查看 ?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
是 [
。 "optional arguments to 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 个长度的字符向量。
我找到了这段代码:
string = c("G1:E001", "G2:E002", "G3:E003")
> sapply(strsplit(string, ":"), "[", 2)
[1] "E001" "E002" "E003"
显然 strsplit(string, ":")
returns 一个大小为 3 的向量,其中每个分量 i 是一个大小为 2 的向量,包含 Gi
和 E00i
.
但是为什么另外两个参数 "[", 2
只对 select 那些 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
输出是一个列表,可以使用应用族函数 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"
查看 ?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
是 [
。 "optional arguments to 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 个长度的字符向量。