在 R 中 reshape data.frame

标签 r reshape

我在 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/

相关文章:

r - 在循环 R 中向向量添加元素的最(内存和时间)有效方法?

r - 如何使用两个不同的标准对 data.table 执行两次聚合函数

r - 为什么在 R 中的 data.table 中使用 "could not find function "函数时会收到此错误消息 "melt"模式

在R中将数据从长 reshape 为半宽

R 从短格式转换为长格式,并以短格式计数

r - 如何在R中 reshape 之前扩展数据

r - 向向量的每个元素添加序列

r - 在具有相同 x 轴的两个结果的多面图中添加显着性水平

r - 通过收集 R 中具有不同值的多个 ID 列,将长格式转换为宽格式

r - 通过 "multiplying"通过其他列的名称转换列的元素