如何根据价值组合重新格式化data.frame?

时间:2015-10-28 19:52:49

标签: r

我有一个ID产品组合列表,我想在R中操作。我想根据匹配的ID列出所有产品组合。如果ID包含没有其他产品的产品(换句话说,单行ID),那么辅助产品将是“不适用”。

例如:

user <- c(1,1,2,3,4,4,4)
prod <- c(100,120,140,100,110,120,150)
data <- cbind(user, prod)

data
      user prod
[1,]   1   100
[2,]   1   120
[3,]   2   140
[4,]   3   100
[5,]   4   110
[6,]   4   120
[7,]   4   150

将转换为:

Primary Secondary
100     120
120     100
110     120
110     150
120     110
120     150
150     110
150     120
140     n/a
100     n/a

我阅读了reshape和apply函数,但我不确定如何将它们应用于此任务。

1 个答案:

答案 0 :(得分:2)

以下是data.table的一个解决方案:

library(data.table)
data <- as.data.table(data)
data[, if(.N > 1) 
         CJ(Primary=prod, Secondary=prod)[
           Primary != Secondary][
           order(Primary)] 
       else list(Primary=prod, Secondary=as.double(NA)), by=user]

#     user Primary Secondary
#  1:    1     100       120
#  2:    1     120       100
#  3:    2     140        NA
#  4:    3     100        NA
#  5:    4     110       120
#  6:    4     110       150
#  7:    4     120       110
#  8:    4     120       150
#  9:    4     150       110
# 10:    4     150       120

如果user包含多行,请返回prodCJ(),其他只有prodNA的组合。