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