Извлечь данные из одного фрейма данных в другой фрейм данных с разной длиной строки

У меня есть два data.frames следующим образом:

df1 <- data.frame(A=c("lee","eeu","ees"), B=c("lee","ggu","1su"), C=c(1,1,1)

    A   B C
1 lee lee 1
2 eeu ggu 1
3 ees 1su 1


df2 <- data.frame (X=c("lee","1su","eeu","ggu"), Y=c("3k3","4k4","5k","2ee"), Z=c("ggg","","","ooo"), ZA=c("vvv","","",""))

    X   Y   Z  ZA
1 lee 3k3 ggg vvv
2 1su 4k4        
3 eeu  5k        
4 ggu 2ee ooo    

Я хочу расширить df1, сопоставив df1 $ B с df2 $ X. Когда df1 $ B = df2 $ X, я хочу добавить дополнительные строки в new_df1 с новым B = другими записями в df2 в той же строке, но сохраняя A и C одинаковыми.

new_df1 должен иметь следующий вид:

 A   B  C
lee 3k3 1 ### df1$B1= df2$X1= lee
lee ggg 1
lee vvv 1
eeu 2ee 1 ### df1$B2= df2$X4= ggu
eeu ooo 1
ees 4k4 1 ### df1$B3= df2$X2= lsu

Мой прошлый опыт использования lapply кажется очень требовательным к памяти, можно ли обойтись без использования lapply?


person psiu    schedule 08.09.2011    source источник


Ответы (3)


Я думаю, что то, что вы хотите, является подмножеством этого:

require(reshape2)
merge(df1,melt(df2, id.var="X"), by.x="B", by.y="X", all=TRUE)
     B    A  C variable value
1  1su  ees  1        Y   4k4
2  1su  ees  1        Z      
3  1su  ees  1       ZA      
4  ggu  eeu  1        Y   2ee
5  ggu  eeu  1        Z   ooo
6  ggu  eeu  1       ZA      
7  lee  lee  1        Y   3k3
8  lee  lee  1        Z   ggg
9  lee  lee  1       ZA   vvv
10 eeu <NA> NA        Y    5k
11 eeu <NA> NA        Z      
12 eeu <NA> NA       ZA      

Я назначил этот объект "M1" (позже заметил, что ему не нужно все = ИСТИНА)

M1 <- merge(df1,melt(df2, id.var="X"), by.x="B", by.y="X")
subset(M1, value != "" , select=c(A,value, C) )
    A value C
1 ees   4k4 1
4 eeu   2ee 1
5 eeu   ooo 1
7 lee   3k3 1
8 lee   ggg 1
9 lee   vvv 1
person IRTFM    schedule 08.09.2011
comment
Но в вашем newdf было больше строк, чем он просил. И снова посмотрев на проблему, я изменил свой ответ, так что я не получаю и не нуждаюсь в тестировании на АН. - person IRTFM; 09.09.2011

Для этой задачи я бы использовал melt () из пакета reshape.

 melt(df2, c("X"))
     X variable value
1  lee        Y   3k3
2  1su        Y   4k4
3  eeu        Y    5k
4  ggu        Y   2ee
5  lee        Z   ggg
6  1su        Z      
7  eeu        Z      
8  ggu        Z   ooo
9  lee       ZA   vvv
10 1su       ZA      
11 eeu       ZA      
12 ggu       ZA      

x <- melt(df2, c("X"))
x$variable <- NULL
x$C <- 1
colnames(x) <- c("A","B","C")

Теперь подмножество и rbind ()

x <- subset(x, B != "")
newdf <- rbind(df1, x)
person Brandon Bertelsen    schedule 08.09.2011

Это сделать намного проще ... используйте функцию match.

df1$Y <- df2$Y[match(df1$B, df2$X)]

Вы также можете расширить его на другие столбцы.

person Subha    schedule 09.09.2011
comment
Я не понимаю, как вы могли бы использовать это для добавления дополнительных строк. Вы можете расширить свой ответ? - person Aaron left Stack Overflow; 11.09.2011