【问题标题】:Counting groups with shared elements计数具有共享元素的组
【发布时间】:2018-04-19 18:09:43
【问题描述】:

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

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

所以基本上,Comp1Comp2 是公司,Product 是这些公司共有的产品名称。我希望输出看起来像这样:

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

我是 R 新手,希望能在这种情况下提供任何帮助。

【问题讨论】:

  • 我不明白你的结果。
  • 你是怎么得到Count的?
  • A 和 B 共享产品 P1、P2、P3。 X 和 Y 相同。这是共享该捆绑包的 2 对公司。 C 和 D 共享 P2 和 P4。那是 1。
  • A 公司和 B 公司有 3 个共同的产品,它们是 P1、P2、P3,X 和 Y 也有相同的产品。因此产品包 p1、p2、p3 是A-B 和 X-Y 共有,所以计数为 2

标签: r


【解决方案1】:

使用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

有测试数据

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)

【讨论】:

  • 第一个字的错字,仅供参考。基本 R 类比:with(aggregate(Product ~ Comp1, dd[order(dd$Product), ], toString), data.frame(table(Product)))
  • @MrFlick 非常感谢,我正在尝试汇总选项,但无法让计数更早地工作。感谢您的快速帮助:)
  • 谢谢@Frank 我试图弄清楚如何在base中做到这一点。
  • 这不只是计算 Comp1 的唯一组合的数量,还是我弄错了? @MrFlick
【解决方案2】:

data.table的解决方案:

library(data.table)
setDT(d)[order(Product), Prod.Bundle := toString(Product), by = Comp1
         ][, .(Count = uniqueN(Comp2)), by = Prod.Bundle]

或者由@Frank 在 cmets 中提供的另一个:

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

给出:

   Prod.Bundle Count
1:  P1, P2, P3     2
2:      P2, P4     1

使用过的数据:

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)

【讨论】:

    【解决方案3】:

    如果您像我一样喜欢使用 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
    

    【讨论】:

    • 如何扩展它以容纳另一列,例如 Comp3?我正在尝试并收到不正确的尺寸错误。
    • 只需将所述列添加到粘贴功能中即可。
    • 我做了,就像dd[[4]]dd[[3]] 之后一样,没有对sapply 行进行任何更改。打印出Error in [.default(dtb, x, ) : incorrect number of dimensions。但如果我在dd[[1]]dd[[3]] 之间移动它,或者在前面移动它就可以了。我的新列是具有相同数量元素的因子,但有 5 个级别,而不是 3 个级别,如果这很重要的话。 dd$Comp3 &lt;- as.factor(c("E", "E", "F", "G", "H", "Z", "Z", "Z"))
    • 嗯。它对我有用。 paste() 应该将您的因素转换为字符类,所以我无法想象这是一个问题。您在paste 中的位置也无所谓。也许你第一次写错字了?
    • 嗯,不知道。我刚刚清理了我的工作区并再次运行它并且它工作。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多