2011-08-25 2 views
2
a=c("A","A,B","C","B,C") 
b=c(1,2,3,4) 
dat<-data.frame(a,b) 

c=c("A","B","D","A") 
d=c(5,6,7,8) 
g<-data.frame(c,d) 

Je voudrais comparer dat et g. Si les éléments de la colonne a de dat correspondent à un élément de la colonne c dans g, l'entrée correspondante de la colonne d dans g doit être ajoutée à dat.appliquer strsplit rowwise et ajouter une colonne aux données

dat$NEW ="" 
sapply(strsplit(as.character(dat$a), ","),function(x){tmp=grep(x,g$c);dat$NEW=x) 

Comment puis-je faire:

g[grep("A",g$c),] 
    c d 
1 A 5 
4 A 8 
entrée dans

dat $ NOUVEAU devrait ressembler à "5,8"?

Répondre

1

Est-ce que cela fonctionne pour vos données?

find.match <- g$c %in% dat$a 
g[find.match, ] 
    c d 
1 A 5 
4 A 8 
+0

Merci pour votre réponse, mais je perds le hit "B" de g dans dat "A, B" – Jasmine

0

Il est pas tout à fait clair, mais ce que je pense que vous décrivez:

Étape 1: combiner des éléments dupliqués dans votre data.frame g

> gc <- sapply(split(g$d, g$c), paste, collapse=",") 
> gc 
    A  B  D 
"5,8" "6" "7" 

Étape 2: Combinez cela dans votre data.frame dat

cbind(dat, 
    new=sapply(
     dat$a, 
     function(x)paste(
       gc[match(strsplit(as.character(x), ",")[[1]], g$c)], 
       collapse=",") 
    ) 
) 

Résultats:

a b new 
1 A 1 5,8 
2 A,B 2 5,8,6 
3 C 3 NA 
4 B,C 4 6,NA 
+0

Great! Et je veux développer mon g: c = c ("A, B", "B", "D", "A") d = c (5,6,7,8) g <-data .frame (c, d) un "A" dans dat doit correspondre à n'importe quelle occurrence de "A" dans g ("A, B", "A") alors je dois utiliser grep? – Jasmine

+0

Il y a probablement une solution impliquant 'grep', mais j'ai modifié ma réponse pour donner les résultats que je pense que vous voulez, en utilisant' strsplit' et 'match' – Andrie

Questions connexes