r - 字符串拆分后访问第 n 个元素

标签 r string split apply

我有一个看起来像的字符串:

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/

相关文章:

r - 如何从 R 中的开始日期和结束日期列表中计算一组中的当前人数

c - 从 C 中的长字符串数组中高效搜索最短和最长的字符串

C#define 字符串,ai_socktype 不支持 Servname

xslt - 复杂的 XSLT 分割?

r - 通过 R 解析 XML 总是返回 XML 声明错误

r - ggplot2 Tufte 线与轴刻度相同

r - 如何使用 R 对两个回归的斜率进行韦尔奇 t 检验?

Python:将字符串转换为十进制数

vim - 如何在 vimdiff 中切换垂直和水平分割?

javascript - 根据值拆分数组