【问题标题】:Aggregate duplicates in multiple columns of a data table in such a way that every value is only listed once聚合数据表的多个列中的重复项,以使每个值仅列出一次
【发布时间】:2016-08-05 18:43:29
【问题描述】:

我有一个字母数字 ID 和相关值的表。有一个 ID 与多个值关联的实例。另一方面,也有给定值对应多个 ID 的实例。我试图以这样一种方式折叠表格,即每个 ID 和每个值只列出一次。我发现了一些接近但不完全相同的问题,例如R finding duplicates in one column and collapsing in a second column,或aggregate values from several fields into one

这是我的数据的示例:

library(data.table)
ID = c("c067","c155","l413","l413","k456","z025","z026","z025","z026")
value = c(47, 47, 57, 58, "vwd", 85, 85, "ca", "ca")
x.raw = data.table(ID, value)

我可以通过这样做得到部分解决方案:

x.tidy1 = x.raw[,list(value = list(value)), by = ID]

但是,请注意值 "47" 和 "c("85", "ca")" 分别出现两次。我真正想要的是在最后得到类似的东西:

ID = list(c("c067","c155"),"l413","k456",c("z025","z026"))
value = list("47",c("57","58"),"vwd",c("85","ca"))
x.tidy2 = data.table(ID, value)

#           ID   value
# 1: c067,c155    47
# 2:      l413 57,58
# 3:      k456   vwd
# 4: z025,z026 85,ca

我试过了,没有成功:

x.tidy2 = x.tidy1[,list(ID = list(ID)), by = value]

我该怎么做?

【问题讨论】:

  • 您是否折叠表格以进行进一步分析?如果是这样,您可能不希望有列表列,因为它们很难使用。如果您只是想查找图表的连接组件,或者将它们可视化,那非常简单。
  • @Frank 是的,我打算进一步分析数据。我不想使用列表,但我想不出另一种存储聚合的方法。
  • Igraph 有很多算法可以处理这样的数据。 igraph.org/r/doc 如果您将其保存在图表中而不是摆弄列表列,那么您很可能可以进行所需的分析。无论如何,这是我的猜测。
  • 我明白了。我不熟悉这个包,但我会检查一下。谢谢。

标签: r duplicates data.table aggregate


【解决方案1】:

要查找连接的组件并用它们标记边...

library(igraph)
g = graph_from_edgelist(as.matrix(x.raw))

mem = components(g)$membership
x.raw[, grp := mem[ match(ID, names(mem))] ]

然后您可以按照 OP 的要求进行总结:

x.raw[, lapply(.SD, function(x) .(unique(x))), by=grp]

#    grp        ID value
# 1:   1 c067,c155    47
# 2:   2      l413 57,58
# 3:   3      k456   vwd
# 4:   4 z025,z026 85,ca

这样的列表列是一种非常难以进行进一步分析的格式。如果您只想可视化组件...

V(g)$type = V(g)$name %like% "^[a-z][0-9]{3}$"
plot(g, layout = layout.bipartite(g))

或者,你知道...

com = make_clusters(g, clusters(g)$mem)
plot(com, g)

【讨论】:

  • igraph 中的好选择
【解决方案2】:

您可以做的一件事是paste 像这样将值组合在一起

x.tidy3<-x.raw[,.(ID=paste0(ID,collapse=',')),by='value'][,.(value=paste0(value,collapse=',')),by='ID']

【讨论】:

  • 是的,只要每个组件子图都是完整的,这应该可以工作。我猜,如果 OP 面对的是x.raw2 = x.raw[-8],我们的答案会有所不同。
  • @Dean 谢谢,但我需要 ID 和值来保留单独的元素,所以我不能使用粘贴。
猜你喜欢
  • 2016-04-04
  • 2023-01-18
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
相关资源
最近更新 更多