我有一个包含3列的数据集。第一列包含产品名称(A到E),相应的2列包含最近的2个邻居(即,在A列中指定产品的客户更有可能购买下一个最好的2个产品(最近的2个邻居)。
m1 = data.frame(Product=c("A","B","C","D","E"), V1=c("C","A","A","A","D"),
V2=c("D","D","B","E","A"))
在第二个数据集中,我有用户级别的数据。第一列包含用户ID,相应的5列包含用户是否拥有该产品的信息。 1 - 拥有它。 0 - 不拥有它。
m2 = data.frame(ID = c(1:7), A = rbinom(7,1,1/2), B = rbinom(7,1,1/2),
C = rbinom(7,1,1/2), D = rbinom(7,1,1/2), E = rbinom(7,1,1/2))
我想在用户级别推荐产品。我希望m1数据基于用户拥有或不与m2合并。输出应该看起来像 -
用户 - 1 A D
答案 0 :(得分:0)
您尚未发布reproducible example以及确切的预期结果,但这似乎符合您的要求。
set.seed(321)
m1 = data.frame(Product=c("A","B","C","D","E"), V1=c("C","A","A","A","D"),
V2=c("D","D","B","E","A"))
m2 = data.frame(ID = c(1:7), A = rbinom(7,1,1/2), B = rbinom(7,1,1/2),
C = rbinom(7,1,1/2), D = rbinom(7,1,1/2), E = rbinom(7,1,1/2))
recommended <- apply(m2, 1, function(x) {
client.recommended <- m1[as.logical(x[-1]),-1]
top <- names(sort(table(as.vector(t(client.recommended))),
decreasing = TRUE)[1:2])
c(x[1], top)
})
recommended <- as.data.frame(t(recommended), stringsAsFactors = FALSE)
ID V2 V3
1 1 A B
2 2 A D
3 3 A B
4 4 A D
5 5 A D
6 6 A D
7 7 A B
此代码的作用:
m2
data.frame(每个客户端)中的每一行,请取一行m1
data.frame的子集(如果客户选择&#34; A&#34;和&#34; B&#34;,则行&#34; A&# 34;&#34; B&#34;来自m1
您似乎希望每个客户端只获得两个产品,这就是此代码的作用。对于具有相同出现次数的产品,显然是按字母顺序排在第一位的产品。您可以通过删除[1:2]
部分来获取所有推荐的产品,但是您需要弄清楚如何将不均匀长度的向量强制转换为单个data.frame。