2011-08-11 6 views
4

J'ai un csv qui ressemble àensembles dans R dataframe

Deamon,Host,1:2:4,aaa.03 
Pixe,Paradigm,1:3:5,11.us 

Je dois lire dans une trame de données pour l'analyse mais la 3ème colonne dans mes données sont séparées par: et doivent être lu comme un ensemble ou liste 1.e divisé par: de sorte qu'il renvoie (1,2,4). Est-il possible d'avoir une colonne qui a une liste de classe dans R? Ou comment pensez-vous que je peux aborder ce problème.

+1

La troisième colonne aura-t-elle toujours trois nombres séparés par des deux-points? Ou peut-il en avoir plus de trois? –

+0

il peut avoir plus de 3 nombres parfois – damola

+0

Voir ma réponse pour différents nombres de ':'. Vous pouvez également utiliser un autre outil de prétraitement pour gérer cela comme 'sed' ou' awk' si un système d'exploitation * nix est dans votre arsenal. – Chase

Répondre

4

Vous pouvez utiliser strsplit pour diviser un vecteur de caractères dans une liste des composants:

x <- c("1:2:4", "1:3:5") 
strsplit(x, split=":") 
[[1]] 
[1] "1" "2" "4" 

[[2]] 
[1] "1" "3" "5" 
1

Essayez d'utiliser gsub pour remplacer ce caractère:

R> str <- "1:2:4" 
R> str 
[1] "1:2:4" 
R> gsub(":", ",", str) 
[1] "1,2,4" 

Assurez-vous que la colonne est une chaîne pas un facteur au préalable.

4

Comme il est indiqué ci-dessus, la réponse varie selon que le nombre de séparateurs dans les colonnes sont cohérentes ou non. La réponse est plus directe si ce nombre est cohérent. Voilà une réponse à faire ce bâtiment hors de strsplit réponse Andrie:

dat <- read.csv("yourData.csv", header=FALSE, stringsAsFactors = FALSE) 

#If always going to be a consistent number of separators 
dat <- cbind(dat, do.call("rbind", strsplit(dat[, 3], ":"))) 

     V1  V2  V3  V4 1 2 3 
1 Deamon  Host 1:02:04 aaa.03 1 02 04 
2 Pixe Paradigm 1:03:05 11.us 1 03 05 

Notez que ce qui précède est essentiellement la façon dont colsplit.character du paquet reshape est mis en œuvre et peut-être une meilleure option pour vous car il vous oblige à donner des noms propres.

Si le nombre de séparateurs est différent, l'utilisation de rbind.fill est une option du package plyr. rbind.fill s'attend à ce que data.frame soit un peu ennuyeux, et je n'arrive pas à comprendre comment obtenir un data.frame à une ligne sans d'abord convertir en matrice, donc j'imagine que cela peut être rendu plus efficace, mais voici l'idée de base:

library(plyr) 
x <- c("1:2:4", "1:3:5:6:7") 
rbind.fill(
    lapply(
    lapply(strsplit(x, ":"), matrix, nrow = 1) 
    , as.data.frame) 
) 

    V1 V2 V3 V4 V5 
1 1 2 4 <NA> <NA> 
2 1 3 5 6 7 

Qui peut alors être cbind comme indiqué ci-dessus.

Questions connexes