R中匹配和填充值

时间:2015-12-25 15:32:44

标签: r

我有一个包含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

1 个答案:

答案 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
  • 将此子集转换为向量
  • 计算向量
  • 中唯一值的出现次数
  • 按计数排序唯一值
  • 获取第一个最常见的唯一值
  • 将这些值与客户ID
  • 一起返回
  • 将所有内容转换为正确的data.frame以进行进一步处理

您似乎希望每个客户端只获得两个产品,这就是此代码的作用。对于具有相同出现次数的产品,显然是按字母顺序排在第一位的产品。您可以通过删除[1:2]部分来获取所有推荐的产品,但是您需要弄清楚如何将不均匀长度的向量强制转换为单个data.frame。