【问题标题】:Does this aggregate approach work efficiently with a millions of data? [duplicate]这种聚合方法能否有效地处理数百万个数据? [复制]
【发布时间】:2017-09-06 08:38:04
【问题描述】:

我正在尝试从数据框/矩阵中找出与其他一些值/类不同的值。

即这里是一个示例初始表:

  P    |   V
------ | ------
par    | 123
par    | 1234
par    | 12345
par    | 123456
pat    | 123
pat    | 1234
pat    | 12345
pat    | 1234567
pay    | 123456
pay    | 789
pay    | 967

如您所见,有一些值(V 列)是唯一的,并且 P 列的一些值是不同的。这些值是

  P    |   V
------ | ------
pat    | 1234567
pay    | 789
pay    | 967

这是预期的输出。

为此,我使用了聚合函数(见下文)),但实际数据会大得多。它们可以达到 2-3 百万行,甚至更多。

您认为下面的代码是否能够正常工作并响应如此多的数据,还是有其他方法可以提高效率?

mat = c("par","par","par","par","pat","pat","pat","pat","pay","pay","pay")
mat = as.data.frame(cbind("P"=mat, "V"=c("123","1234","12345","123456","123","1234","12345","1234567","123456","789","967")))

uniquePs = matrix(unique(mat$P))
diff = aggregate(P~V, mat, FUN=unique)
distinctVs = diff[which( grepl(":|," , as.character(diff$P) ) == FALSE ),]
distinctVs$P = uniquePs[as.numeric(distinctVs$P)] 

谢谢。

【问题讨论】:

  • 你的意思是lengths(diff$P)>1而不是grepl
  • 是的。这也可以工作

标签: r unique aggregate


【解决方案1】:

您可以使用另一种方法。 2-3百万行的效率应该没问题:

subset(df, ave(as.character(P), V, FUN = function(x) length(unique(x))) == 1L)
#     P       V
#8  pat 1234567
#10 pay     789
#11 pay     967

下面是基本 R 中更简单的方法:

subset(unique(df), !(duplicated(V) | duplicated(V, fromLast = TRUE)))
#     P       V
#8  pat 1234567
#10 pay     789
#11 pay     967

【讨论】:

  • 非常感谢你们俩。我会全部试一试,然后决定哪个更快。
【解决方案2】:

也许我们需要

library(data.table)
setDT(df1)[, .SD[uniqueN(P)==1], V]
#        V   P
#1: 1234567 pat
#2:     789 pay
#3:     967 pay

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多