【问题标题】:Aggregate a data.frame without a function聚合一个没有函数的data.frame
【发布时间】:2013-05-09 09:19:34
【问题描述】:

我有示例数据框

test.df<-data.frame(id=c("A","A","A","B","B","B"), time=c(1:3,1:3), x1=c(1,1,1,2,2,2), x2=c("A","A","A","B","B","B"))

x1x2 变量在每个 id 内都是相同的

我想把上面的数据框聚合起来得到下面的

target.df<-data.frame(id=c("A","B"), x1=c(1,2), x2=c("A","B"))

从某种意义上说,我希望aggregate 没有任何FUN。我尝试使用FUN=unique,但似乎不起作用。我的原始数据框有 100 万行和数千个 x1,x2.... 不同类型(字符、日期等)的变量,但在每个 ID 中都是相同的。这和excel中的数据透视表是一样的

非常感谢

【问题讨论】:

    标签: r dataframe summarization


    【解决方案1】:

    您所说的问题似乎是从data.frame 中删除重复的行,而这不需要 需要任何聚合。根据您的示例,这就是您所追求的:

    unique(test.df[c(1,3,4)])
    # id x1 x2
    #1  A  1  A
    #4  B  2  B
    

    编辑:

    我不太明白你的意思是什么:

    “我尝试使用FUN=unique,但似乎不起作用。”

    只是为了解释你在aggregate 上可能得到的错误,在这里,我展示了如何使用aggregate 得到相同的结果:

    test.df$x2 <- as.character(test.df$x2)
    aggregate(. ~ id, FUN=unique , data = test.df[c(1,3,4)] )
    
    #  id x1 x2
    #1  A  1  A
    #2  B  2  B
    

    但是,这里不需要使用aggregate()。这个问题的效率非常低。您可以使用system.time(.) 进行检查,即使在此数据上也已经有所不同:

    system.time(unique(test.df[c(1,3,4)]))
    #    user  system elapsed 
    #   0.001   0.000   0.001 
    system.time(aggregate(. ~ id, FUN=unique , data = test.df[c(1,3,4)] ))
    #    user  system elapsed 
    #   0.004   0.000   0.004 
    

    继续在百万行上运行它,并使用identical 检查结果并查看运行时间。

    从您的 cmets 来看,我认为您对 unique 的行为感到困惑。正如@mnel 解释的那样,它(unique.data.frame) 从给定的data.frame 中单独删除所有重复的行。它适用于您的情况,因为您说x1x2 对于每个ID 将具有相同的值。所以,您不必必须知道data.frame ID 在哪里。您只需为每个ID 选择1 行。

    【讨论】:

    • 这对我没有帮助。我希望按 ID 汇总。
    • @ECII 这确实会产生所需的target.df
    • 但没有回答问题。我有一百万行和数千个 ID。我不知道每个 ID 何时首次出现以进行矢量化。我必须汇总。
    • @ECII,这不是他提出的答案。这是为了澄清,以防您确实按唯一的 id 聚合。这里的答案很明显:unique(.)。你的答案到底有什么问题?给我们一个例子,这不起作用。
    • @Arun 勇敢的尝试,只有这么多一个人能做到!我按照您的建议进行了编辑。如果您觉得可以使这一点变得更好,请随时进行编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2010-11-23
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多