我有一个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函数,但我不确定如何将它们应用于此任务。
答案 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
包含多行,请返回prod
到CJ()
,其他只有prod
和NA
的组合。