我有一个看起来像的字符串:
string <- c("A,1,some text,200", "B,2,some other text,300", "A,3,yet another one,100")
所以每个向量元素都用逗号进一步划分。
现在我只想在某个地方提取元素。假设第一个逗号之前的所有元素或第二个逗号之后的所有元素。
以下代码执行我想要的操作:
sapply(strsplit(string, ","), function(x){return(x[[1]])})
# [1] "A" "B" "A"
sapply(strsplit(string, ","), function(x){return(x[[3]])})
# [1] "some text" "some other text" "yet another one"
然而,这段代码对我来说似乎相当复杂(考虑到问题的简单性)。是否有更简洁的选项来实现我想要的?
最佳答案
1) 数据框转换为数据框,然后很容易挑选出一列或列的子集:
DF <- read.table(text = string, sep = ",", as.is = TRUE)
DF[[1]]
## [1] "A" "B" "A"
DF[[3]]
## [1] "some text" "some other text" "yet another one"
DF[-1]
## V2 V3 V4
## 1 1 some text 200
## 2 2 some other text 300
## 3 3 yet another one 100
DF[2:3]
## V2 V3
## 1 1 some text
## 2 2 some other text
## 3 3 yet another one
2) data.table::transpose data.table 包具有转置列表的功能,以便如果
stringt
是转置列表然后 stringt[[3]]
是第三个域的向量,例如,与 (1) 类似。更紧凑的是 data.table 的 tstrsplit
由@Henrik 在下面或相同包的 fread
中提到下面@akrun 提到。library(data.table)
stringt <- transpose(strsplit(string, ","))
# or
stringt <- tstrsplit(string, ",")
stringt[[1]]
## [1] "A" "B" "A"
stringt[[3]]
## [1] "some text" "some other text" "yet another one"
stringt[-1]
## [[1]]
## [1] "1" "2" "3"
##
## [[2]]
## [1] "some text" "some other text" "yet another one"
##
## [[3]]
## [1] "200" "300" "100"
stringt[2:3]
## [[1]]
## [1] "1" "2" "3"
##
## [[2]]
## [1] "some text" "some other text" "yet another one"
purrr 也有
transpose
功能但是library(purrr)
transpose(strsplit(string, ","))
生成列表列表而不是字符向量列表。
关于r - 字符串拆分后访问第 n 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54537366/