r - 在 R 中,将一列值与所有其他列进行比较

标签 r

我是 R 的新手,我有一个问题对于这里的专家来说可能非常简单。

假设我有一个表“sales”,其中包含 4 个客户 ID (123-126) 和 4 个产品(A、B、C、D)。

ID  A   B   C   D
123 0   1   1   0
124 1   1   0   0
125 1   1   0   1
126 0   0   0   1

我想计算产品之间的重叠。所以对于 A,同时具有 A 和 B 的 ID 的数量将为 2。同样,A 和 C 之间的重叠将为 0,A 和 D 之间的重叠将为 1。这是我的 A 和 B 重叠代码:

overlap <- sales [which(sales [,"A"] == 1 & sales [,"B"] == 1 ),]
countAB <- count(overlap,"ID")

我想对所有 4 种产品重复此计算,因此 A 与 B、C、D 重叠,B 与 A、C、D 重叠,等等...我如何更改代码来完成此操作?

我希望最终输出是每个两种产品组合的 ID 数。这是产品亲和性练习,我想找出一种产品,哪种产品销量最高。例如,对于 A,最畅销的产品是 B,其次是 D,然后是 C。我认为需要在代码中添加一些排序才能实现这一点。

感谢您的帮助!

最佳答案

    #x1 is your dataframe
x1<-structure(list(ID = 123:126, A = c(0L, 1L, 1L, 0L), B = c(1L, 
1L, 1L, 0L), C = c(1L, 0L, 0L, 0L), D = c(0L, 0L, 1L, 1L)), .Names = c("ID", 
"A", "B", "C", "D"), class = "data.frame", row.names = c(NA, 
-4L))
#get the combination of all colnames but the first ("ID")
    k1<-combn(colnames(x1[,-1]),2)
#create two lists a1 and a2 so that we can iterate over each element 
    a1<-as.list(k1[seq(1,length(k1),2)])
    a2<-as.list(k1[seq(2,length(k1),2)])
# your own functions with varying i and j
     mapply(function(i,j) length(x1[which(x1[,i] == 1 & x1 [,j] == 1 ),1]),a1,a2)
    [1] 2 0 1 1 1 0

关于r - 在 R 中,将一列值与所有其他列进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28639040/

相关文章:

r - 如何通过data.table中的引用删除一行?

r - 更快的替代 object.size?

R - 使用 with() 从数据帧创建新变量

r - 从每日时间序列(动物园)中提取冬季(Dez、Jan、Feb)

r - 如果在 R 中模拟后使用鼠标滚轮,Windows 7 将变得无响应

R::如何从 chisq.test 输出中获取 p 值

r - 底部多 Axis

r - 创建具有行和列 R 特有的条目的矩阵

r - 查找两个区间数据之间的重叠范围

r - 循环遍历数据框中所有列的组合