применить strsplit по очереди и добавить столбец к данным - PullRequest
2 голосов
/ 25 августа 2011
 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)

Я хотел бы сравнить данные и g.Если элементы в столбце a dat совпадают с элементом столбца c в g, к dat следует добавить соответствующую запись столбца d в ​​g.

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

Как мне сделать:

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

запись в dat $ NEW должна выглядеть как "5,8"?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Это работает для ваших данных?

find.match <- g$c %in% dat$a
g[find.match, ]
  c d
1 A 5
4 A 8
0 голосов
/ 25 августа 2011

Это не совсем понятно, но вот что, я думаю, вы описываете:

Шаг 1. Объедините дублированные элементы в ваших данных. Рамка g

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

Шаг 2: Объедините это в свой data.frame dat

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

Результаты:

    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
...