2015-12-25 67 views
0

我有一个包含3列的数据集。第一栏包含产品名称(A至E)和相应的2列包含最近2点的邻居(即谁拥有在A列中规定的产品更有可能购买下一个最好的2个产品(最近2个邻居)的客户。在R中匹配和填充值

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

预期产量是多少? – akrun

+3

请使用'set.seed'让您的输入重现,然后显示输入中预期的完整输出。 –

回答

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的到行中找到的值(如果客户选择“A”和“B”,则从m1获得行“A”和“B”
  • 通过计数打开这个子集为载体
  • 唯一值的计数出现在矢量
  • 排序的唯一值
  • 拍摄第一张最常见的唯一值
  • 返回这些值与客户端ID一起
  • 关闭所有进入正确的data.frame进一步处理

看来你期望只为每个客户端获得两个产品,这就是代码的作用。对于出现次数相同的产品,显然是按字母顺序排列的产品获胜。您可以通过删除[1:2]部分来获得所有推荐的产品,但是您需要弄清楚如何将不均匀长度的向量转换为单个数据。

+0

谢谢ton.It工程! – Riya