2016-09-13 4 views
1

J'ai une liste R list1, où un champ a été fait pour être deux chaînes concaténées avec ensemble.Comment utiliser strsplit() pour accéder aux éléments d'une liste R?

Quand nous le champ d'accès field3 pour list1, il ressemble à ceci

list1$field2 

[1] "stringA, stringB"  
[2] "stringA, stringB"  
[3] "stringA, stringB" 
[4] "stringA, stringB" 
[5] "stringA, stringB" 
[6] "stringA, stringB"    
.... 

Je voudrais seulement accéder aux entrées « chaineB » et ignorer « stringUn ».

Si j'utilise quelque chose comme strsplit(), je reçois le texte suivant:

strsplit(list1$field2, ",") 
[[1]] 
[1] "stringA" 
[2] "stringB" 
[[2]] 
[1] "stringA" 
[2] "stringB" 
.... 

Ceci est une liste dans laquelle chaque membre a deux éléments. Comment est-ce que j'accède seulement au deuxième élément? Existe-t-il un moyen de rendre cela plus compact sur le plan syntaxique?

+4

'lapply (StrSplit (list1 field2 $, ""),' [ ', 2)' va obtenir le deuxième élément de chaque composant de la seconde liste vous affichez (c'est-à-dire la liste retournée par 'strsplit()'). –

+0

@GavinSimpson - 'lapply (strsplit (list1 $ field2,", "), \' [\ ', 2)' Je pense que vous voulez dire - doit échapper aux backticks dans les commentaires. – thelatemail

+1

Vous pouvez utiliser '" ["' avec lapply'. Ne pas avoir besoin de backticks. –

Répondre

1

Une "approche tidyverse" semblable à la suggestion dans les commentaires par @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() agit comme strsplit().
  • map_chr() agit comme lapply(), mais convertit également la liste résultante en un vecteur de caractères.

Pour votre problème, remplacer x pour list1$field2

1

est fonction ici qui est rapide pour la conversion d'une chaîne d'éléments 2 à une trame de données:

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

Cela lu que vecteur et analyser comme un fichier texte, alors vous pouvez simplement prendre la deuxième colonne » "

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