2017-01-03 3 views
1

J'ai un fichier CSV, où deux colonnes contiennent un ou plusieurs entiers par cellule.Créer un vecteur à partir de LookUp-Table/fichier CSV dans R

df <- data.frame(x=c("a","b","a","b"), 
y=c("datatype 1","datatype 1","datatype 2", "datatype 2"), 
z=c("2,3", "1,2","1,2,3,4,5", "3")) 

names(df) <- c("hypothesis", "type", "mass") 

> df 
    hypothesis  type  mass 
1   a datatype 1  2,3 
2   b datatype 1  1,2 
3   a datatype 2 1,2,3,4,5 
4   b datatype 2   3 

Je veux extraire les entiers de la .csv en tant que vecteurs et les affecter à des variables x (1, hypothèse type de données a) et y (2, hypothèse datatype a) dans mon code.

Actuellement, j'utilise subset pour filtrer la table par "type de données" (colonne 2) et which ("hypothèse"/colonne 1) pour obtenir les valeurs de "masse" correspondantes dont j'ai besoin. Dans l'étape suivante, je veux utiliser intersect pour savoir quels éléments sont partagés par x et y variables.

Ma question est, comment puis-je obtenir un contenu de cellules .csv comme "1,2,3" dans un vector, à laquelle la fonction intersect est applicable?

Lorsque j'appelle simplement la cellule, j'obtiens typeofinteger et quand intersect est appliqué, le résultat est character(0). Quand j'Affectez manuellement x <- c(1,2,3,4,5); y <- c(2,3) le résultat est - comme cela devrait être - 2 3

+0

images ne sont pas du code ou des données à moins qu'il est lié le traitement d'image. S'il vous plaît essayez de respecter les gens qui répondent sur le site et suivez les instructions http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example qui ont été montrés dans les liens présentés à vous lorsque vous avez posté une question dans la balise R. L'utilisation d'images pour les données ou le code est maintenant à des proportions presque épidémiques dans l'étiquette R. – hrbrmstr

+0

Mes excuses, j'ai édité le post, j'espère qu'il est réplicable et conforme aux normes maintenant. – Ezra

Répondre

0

Nous pouvons split la « masse » par le « type », diviser la chaîne en utilisant strsplit, unlist, convertir à numeric, obtenir les unique éléments et appliquer intersect pour trouver les éléments qui sont communs à travers les éléments list

lst <- setNames(lapply(split(df$mass, df$type), function(x) 
     sort(unique(as.numeric(unlist(strsplit(as.character(x), ",")))))), c("x", "y")) 

Reduce(intersect, lst) 
+0

Merci akrun. J'ai essayé une partie de votre code suggéré: mes données ressemblent à ceci: '> x [[1]] [1] 2,3 Niveaux: 1 1,2 1,2,3,4,5 2 2,3 2,3,4,5 3 3,4,5 4 5' J'ai utilisé votre code: 'a <- as.numeric (unlist (strsplit (as.character (x),", ")))' et le résultat est: '> un [1] 6'. Dois-je affecter un type de données différent à la colonne de mon fichier de données? J'ai vraiment besoin d'un vecteur des éléments, je voudrais appliquer l'intersection dans une étape différente (dans la fonction que j'écris actuellement, j'ai 4 variables qui doivent être recoupées les unes avec les autres). Une idée, ce que je fais mal? – Ezra

+0

@Ezra Si vous avez besoin de 4 intersections, il vaut mieux la garder comme 'list' (comme je l'ai montré et ensuite utiliser' Reduce' au lieu de créer des objets individuels dans l'environnement global – akrun

+0

@Ezra Concernant votre objet 'x ', est-ce une' liste' ou 'vecteur'? Si c'est une' liste', alors 'strsplit (as.character (unlist (x)),", ")' – akrun