我在R中浏览了一些关于strsplit
的答案。示例文字:
fileName <- c("hello.w-rp-al",
"how.nez-r",
"do.qs-sdz",
"you.d-aerd",
"do.dse-e")
我想获得创建列表的第一个元素,并认为我可以使用诸如
之类的东西fileNameSplit <- strsplit(fileName, "[.]")
node_1 <- fileNameSplit[0]
node_2 <- fileNameSplit[1]
但那不起作用。
然后我发现this answer建议将sapply
与[
一起使用。这确实有效。
d <- data.frame(fileName)
fileNameSplit <- strsplit(d$fileName, "[.]")
d$node_1 <- sapply(fileNameSplit, "[", 1)
d$node_2 <- sapply(fileNameSplit, "[", 2)
但是,我试图找出为什么。究竟发生了什么,以及[
与任何事情有什么关系?在我看来,它在语义上令人困惑。
答案 0 :(得分:12)
sapply
对列表进行操作,列表是每个元素可以采用任何形式的向量。
在fileNameSplit
列表的特殊情况下,我们知道列表的每个元素都是带有两个元素的字符向量。
> fileNameSplit
[[1]]
[1] "hello" "w-rp-al"
[[2]]
[1] "how" "nez-r"
[[3]]
[1] "do" "qs-sdz"
[[4]]
[1] "you" "d-aerd"
[[5]]
[1] "do" "dse-e"
要从每个这些字符向量中提取第一个元素,我们必须迭代列表,这就是
sapply(fileNameSplit, `[`, 1)
一样。写作
时可能更清楚sapply(fileNameSplit, function(x) x[1])
?`[`
和?sapply
处的文档解释了较短版本的原因。
我们使用1
,因为这是R中索引开始的地方(与其他从0开始的语言不同)。