R 使用共享元素计数组

R 使用共享元素计数组,r,R,我有一个如下所示的数据集: Comp1 Product Comp2 A P1 B A P2 B A P3 B C P4 D C P2 D X P1 Y X P2 Y X P3 Y 因此,基本上,Comp1和Comp2是公司,Product是这些公司共同拥有的产品名称。我希望输出显示如下所示: Product Bund

我有一个如下所示的数据集:

Comp1  Product  Comp2
A       P1      B
A       P2      B
A       P3      B
C       P4      D
C       P2      D
X       P1      Y
X       P2      Y
X       P3      Y
因此,基本上,
Comp1
Comp2
是公司,
Product
是这些公司共同拥有的产品名称。我希望输出显示如下所示:

Product Bundle    Count
P1,P2,P3          2
P2,P4             1

我是R新手,非常感谢您在这种情况下提供的帮助。

使用
dplyr
,您可以汇总数据,然后进行计数。比如说

library(dplyr)

dd %>% arrange(Comp1, Product) %>% 
  group_by(Comp1) %>% 
  summarize(bundle=paste(unique(Product), collapse=",")) %>% 
  count(bundle)

#     bundle     n
#      <chr> <int>
# 1 P1,P2,P3     2
# 2    P2,P4     1
库(dplyr)
dd%%>%排列(组件1,产品)%%>%
组别(组别1)%>%
汇总(捆绑=粘贴(唯一(产品),折叠=“,”)%%
计数(束)
#束
#       
#1 P1、P2、P3 2
#2 P2,P4 1
用测试数据

dd <- read.table(text="Comp1  Product  Comp2
A       P1      B
A       P2      B
A       P3      B
C       P4      D
C       P2      D
X       P1      Y
X       P2      Y
X       P3      Y", header=TRUE)

dd包含
数据的解决方案。表

library(data.table)
setDT(d)[order(Product), Prod.Bundle := toString(Product), by = Comp1
         ][, .(Count = uniqueN(Comp2)), by = Prod.Bundle]
或@Frank在评论中提供的其他内容:

setDT(d)[order(Product), toString(Product), by = Comp1
         ][, .(Count = .N), by = .(Prod.Bundle = V1)]
其中:


使用数据:

d <- read.table(text="Comp1  Product  Comp2
A       P1      B
A       P2      B
A       P3      B
C       P4      D
C       P2      D
X       P1      Y
X       P2      Y
X       P3      Y", header=TRUE, stringsAsFactors=FALSE)

d如果您喜欢像我一样使用base r,这是一个想法:

dtb <- table(paste(dd[[1]],dd[[3]]),dd[[2]])
out <- sapply(1:nrow(dtb),function(x) paste(colnames(dtb)[dtb[x,] == 
1],collapse = ","))
table(out)
out
P1,P2,P3    P2,P4 
       2        1

dtb我不明白你的结果。你是如何得到
Count
?A和B都共享产品P1、P2和P3。X和Y也是一样。这是两个公司对共享该捆绑包。C和D共享P2和P4。那就是1。A公司和B公司有3种共同的产品,分别是P1、P2、P3,同样的产品对X公司和Y公司来说也是共同的。因此,产品包P1、P2、P3对A-B和X-Y公司来说是共同的,所以在您的第一个单词中,数量是2Typo,仅供参考。Base R模拟:
带有(聚合(产品~Comp1,dd[order(dd$Product),],toString),data.frame(表(产品))
@MrFlick非常感谢,我尝试了summary选项,但无法使计数提前工作。感谢您的快速帮助:)谢谢@Frank我一直在想如何在base中实现这一点。这不只是计算Comp1的唯一组合数,还是我弄错了@mrflick3您如何扩展它以容纳另一列,比如Comp3?我正在尝试并得到一个不正确的维度数错误。只需将所述列添加到粘贴函数中。我在
dd[[4]]]
之后,没有对
sapply
行进行任何更改。在
[]中打印出
错误。默认值
(dtb,x,):维度数不正确
。但如果我将其在
dd[[1]]
dd[[3]]之间移动,它就会起作用
,或在前面。我的新列是一个元素数相同的因子,但有5个级别,而不是3个级别,如果这很重要的话。
dd$Comp3-Hmm。它对我有用。
paste()
应该将您的因子转换为字符类,所以我无法想象这会是一个问题。也不应该介意您将
粘贴到
中的什么位置。可能是您第一次使用的拼写错误?嗯,不知道。我刚刚清理了我的工作区并再次运行了它,它成功了。不过,谢谢。
dtb <- table(paste(dd[[1]],dd[[3]]),dd[[2]])
out <- sapply(1:nrow(dtb),function(x) paste(colnames(dtb)[dtb[x,] == 
1],collapse = ","))
table(out)
out
P1,P2,P3    P2,P4 
       2        1