从数据帧列表中创建一个命名表

Nik*_*nin 5 r dataframe

假设我有一个包含产品ID的列和一个包含它们特征的数据框列表:

捆绑数据帧

 bundle
1  284993459
2 1048768805
3  511310430
4 1034630958
5 1235581326
Run Code Online (Sandbox Code Playgroud)

d2列表

[[1]]
    id value
1   35   0.2
2 1462   0.2
3 1109   0.2
4  220   0.2
5  211   0.1

[[2]]
list()

[[3]]
    id name value
1  394        0.5
2 1462        0.5

[[4]]
    id name value
1  926        0.3
2 1462        0.3
3  381        0.3
4  930        0.2

[[5]]
    id name value
1  926        0.5
2 1462        0.5
Run Code Online (Sandbox Code Playgroud)

我需要为每个产品创建包含所有特征ID及其值的列.

bundle =  data.frame(bundle =  c(284993459,1048768805,511310430,1034630958,1235581326))
d2<- list(data.frame(id = c(35,1462,1109,220,211), value = c(0.2, 0.2, 0.2,0.2,0.1)), 
                    data.frame(id = NULL, value = NULL), 
                    data.frame(id = c(394,1462), value = c(0.5,0.5)),
                    data.frame(id = c(926,1462,381,930), value = c(0.3,0.3,0.3,0.2)),
                    data.frame(id = c(926,1462), value = c(0.5,0.5))) 

         bundle    35 1462 1109 220 211 394 1462
    1  284993459   0.2  0.2  0.2 0.2 0.1   0    0
    2 1048768805     0    0    0   0   0   0    0
    3  511310430     0    0    0   0   0 0.5  0.5  
Run Code Online (Sandbox Code Playgroud)

无法弄清楚如何做到这一点.有想法取消列出这个数据框列表,但没有好的结果,因为有超过8000个prodict ID:

for (i in seq(d2))
  assign(paste0("df", i), d2[[i]])  
Run Code Online (Sandbox Code Playgroud)

如果我们采用与我不同的方法来连接转置的特征数据帧,那么值将逐行填充.

Moo*_*per 2

这是一个tidyverse解决方案。首先,我们向所有列添加一个捆绑列data.frames,并使用 将它们缝合在一起purr::map2_dfr,然后使用tidyr::spread格式化为宽。

library(tidyverse)
res <- map2_dfr(bundle$bundle,d2,~mutate(.y,bundle=.x)) %>%
  spread(id,value,)
res[is.na(res)] <- 0
#       bundle  35 211 220 381 394 926 930 1109 1462
# 1  284993459 0.2 0.1 0.2 0.0 0.0 0.0 0.0  0.2  0.2
# 2  511310430 0.0 0.0 0.0 0.0 0.5 0.0 0.0  0.0  0.5
# 3 1034630958 0.0 0.0 0.0 0.3 0.0 0.3 0.2  0.0  0.3
# 4 1235581326 0.0 0.0 0.0 0.0 0.0 0.5 0.0  0.0  0.5
Run Code Online (Sandbox Code Playgroud)