如何使用 strsplit() 访问 R 列表中的元素?
How to use strsplit() to access elements in an R list?
我有一个 R 列表 list1
,其中一个字段是两个字符串连接在一起的。
当我们为 list1
访问字段 field3
时,它看起来像这样
list1$field2
[1] "stringA, stringB"
[2] "stringA, stringB"
[3] "stringA, stringB"
[4] "stringA, stringB"
[5] "stringA, stringB"
[6] "stringA, stringB"
....
我只想访问条目 "stringB",而忽略 "stringA"。
如果我使用 strsplit()
之类的东西,我会得到以下信息:
strsplit(list1$field2, ",")
[[1]]
[1] "stringA"
[2] "stringB"
[[2]]
[1] "stringA"
[2] "stringB"
....
这是一个列表,其中每个成员都有两个元素。如何只访问第二个元素?有没有办法使它在语法上更紧凑?
这是将 2 元素字符串快速转换为数据框的函数:
strToDf<-function (list){
slist<-strsplit(list, ",")
x<-sapply(slist, FUN= function(x) {x[1]})
y<-sapply(slist, FUN= function(x) {x[2]})
#x<-as.numeric(x)
#y<-as.numeric(y)
df<-data.frame(x=x, y=y, stringsAsFactors = FALSE)
return(df)
}
这将读取该向量并将其解析为文本文件,因此您可以只使用第二个 "column"
scan(text=list1$field2, what=list("",""))[[2]]
Read 6 records
[1] "stringB" "stringB" "stringB" "stringB" "stringB" "stringB"
一种类似于@GavinSimpson 评论中的建议的"tidyverse"方法:
library(purrr)
library(stringr)
x <- rep("stringA, stringB", 10)
str_split(x, ", ") %>% map_chr(`[`, 2)
#> [1] "stringB" "stringB" "stringB" "stringB" "stringB" "stringB" "stringB"
#> [8] "stringB" "stringB" "stringB"
str_split()
表现得像 strsplit()
.
map_chr()
的作用类似于 lapply()
,但还会将结果列表转换为字符向量。
对于您的问题,请将 x
替换为 list1$field2
strsplit(list1$field2, ",")[[1]][2]
将访问第二个元素。
strsplit(list1$field2, ",")[[1]][[2]]
==> 将访问第二个元素
strsplit(list1$field2, ",")[[1]][[5]]
==> 将访问第 5 个元素
我有一个 R 列表 list1
,其中一个字段是两个字符串连接在一起的。
当我们为 list1
访问字段 field3
时,它看起来像这样
list1$field2
[1] "stringA, stringB"
[2] "stringA, stringB"
[3] "stringA, stringB"
[4] "stringA, stringB"
[5] "stringA, stringB"
[6] "stringA, stringB"
....
我只想访问条目 "stringB",而忽略 "stringA"。
如果我使用 strsplit()
之类的东西,我会得到以下信息:
strsplit(list1$field2, ",")
[[1]]
[1] "stringA"
[2] "stringB"
[[2]]
[1] "stringA"
[2] "stringB"
....
这是一个列表,其中每个成员都有两个元素。如何只访问第二个元素?有没有办法使它在语法上更紧凑?
这是将 2 元素字符串快速转换为数据框的函数:
strToDf<-function (list){
slist<-strsplit(list, ",")
x<-sapply(slist, FUN= function(x) {x[1]})
y<-sapply(slist, FUN= function(x) {x[2]})
#x<-as.numeric(x)
#y<-as.numeric(y)
df<-data.frame(x=x, y=y, stringsAsFactors = FALSE)
return(df)
}
这将读取该向量并将其解析为文本文件,因此您可以只使用第二个 "column"
scan(text=list1$field2, what=list("",""))[[2]]
Read 6 records
[1] "stringB" "stringB" "stringB" "stringB" "stringB" "stringB"
一种类似于@GavinSimpson 评论中的建议的"tidyverse"方法:
library(purrr)
library(stringr)
x <- rep("stringA, stringB", 10)
str_split(x, ", ") %>% map_chr(`[`, 2)
#> [1] "stringB" "stringB" "stringB" "stringB" "stringB" "stringB" "stringB"
#> [8] "stringB" "stringB" "stringB"
str_split()
表现得像strsplit()
.map_chr()
的作用类似于lapply()
,但还会将结果列表转换为字符向量。
对于您的问题,请将 x
替换为 list1$field2
strsplit(list1$field2, ",")[[1]][2]
将访问第二个元素。
strsplit(list1$field2, ",")[[1]][[2]]
==> 将访问第二个元素
strsplit(list1$field2, ",")[[1]][[5]]
==> 将访问第 5 个元素