我在 R 中有一个 data.frame。
df = data.frame(custid=c(1,2,3,4),prod1=c('jeans','tshirt','jacket','tshirt'),prod1_hnode1=c(1,2,3,2),prod1_hnode2=c(6,7,8,7),prod2=c('tshirt','jeans','jacket','shirt'),prod2_hnode1=c(2,1,3,4),prod2_hnode2=c(7,6,8,7))
> df
custid prod1 prod1_hnode1 prod1_hnode2 prod2 prod2_hnode1 prod2_hnode2
1 1 jeans 1 6 tshirt 2 7
2 2 tshirt 2 7 jeans 1 6
3 3 jacket 3 8 jacket 3 8
4 4 tshirt 2 7 shirt 4 7
如何将其 reshape 为?
custid prod rec hnode1 hnode2
1 1 prod1 jeans 1 6
2 1 prod2 tshirt 2 7
3 2 prod1 tshirt 2 7
4 2 prod2 jeans 1 6
5 3 prod1 jacket 3 8
6 3 prod2 jacket 3 8
7 4 prod1 tshirt 2 7
8 4 prod2 shirt 4 7
刚刚在 python
中得到了如何执行此操作的答案here 。好奇R
解决方案也是如此。
最佳答案
我们可以使用 data.table
中的 melt
来做到这一点
library(data.table)
melt(setDT(df), measure = patterns("^prod\\d+$", "hnode1", "hnode2"),
value.name = c("rec", "hnode1", "hnode2"), variable.name = 'prod')[,
prod := paste0("prod", prod)][order(custid)]
# custid prod rec hnode1 hnode2
#1: 1 prod1 jeans 1 6
#2: 1 prod2 tshirt 2 7
#3: 2 prod1 tshirt 2 7
#4: 2 prod2 jeans 1 6
#5: 3 prod1 jacket 3 8
#6: 3 prod2 jacket 3 8
#7: 4 prod1 tshirt 2 7
#8: 4 prod2 shirt 4 7
关于在 R 中 reshape data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48224279/