2016-09-13 44 views
1

我有一个R列表list1,其中一个字段被制成两个字符串连在一起。如何使用strsplit()访问R列表中的元素?

当我们存取权限领域field3list1,它看起来像这样

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" 
.... 

这是每个成员有两个元素的列表。我如何才能访问第二个元素?有没有办法让这个语法更紧凑?

+4

'lapply(strsplit(列表1场2 $ “”),'['2)'会得到第二列表的每个组成的第二个元素你显示(即'strsplit()'返回的列表)。 –

+0

@GavinSimpson - 'lapply(strsplit(list1 $ field2,“,”),\'[\',2)'我认为你的意思是 - 必须在评论中逃避反引号。 – thelatemail

+1

你可以使用''[''''lapply'。不需要反引号。 –

回答

1

A ”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()一样,但也会将结果列表转换为字符向量。

对于您的问题,替代xlist1$field2

1

这里是函数,它是快速对于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) 
} 
1

这将读取向量和解析为一个文本文件,所以这时可以只取第二“列通过@GavinSimpson类似的意见建议“

scan(text=list1$field2, what=list("",""))[[2]] 
Read 6 records 
[1] "stringB" "stringB" "stringB" "stringB" "stringB" "stringB"