假设我有一个包含产品ID的列和一个包含它们特征的数据框列表:
bundle
1 284993459
2 1048768805
3 511310430
4 1034630958
5 1235581326
Run Code Online (Sandbox Code Playgroud)
[[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)
如果我们采用与我不同的方法来连接转置的特征数据帧,那么值将逐行填充.
这是一个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)