2016-09-13 3 views
1

У меня есть список R list1, в котором одно поле было сделано как две строки, объединенные вместе.Как использовать strsplit() для доступа к элементам в списке R?

Когда мы Acces поле field3 для list1, это выглядит, как этот

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 $ field2, ""),' [ ', 2)' получите второй элемент каждого компонента второго списка вы показываете (т. е. список, возвращаемый 'strsplit()'). –

+0

@GavinSimpson - 'lapply (strsplit (list1 $ field2,", "), \' [\ ', 2)' Я думаю, вы имеете в виду - должны избегать обратных ссылок в комментариях. – thelatemail

+1

Вы можете использовать '' ['' с 'lapply'. Не нужны обратные сигналы. –

ответ

1

А "tidyverse" подход, аналогичный предложению в комментариях по @GavinSimpson:

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

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

Это будет читать этот вектор и синтаксического анализа в виде текстового файла, так, то вы можете просто взять второй «столбец "

scan(text=list1$field2, what=list("",""))[[2]] 
Read 6 records 
[1] "stringB" "stringB" "stringB" "stringB" "stringB" "stringB" 
Смежные вопросы