在没有函数的情况下聚合data.frame

时间:2013-05-09 09:19:34

标签: r dataframe summarization

我有示例数据框

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

中的数据透视表相同

非常感谢

1 个答案:

答案 0 :(得分:5)

您说明的问题似乎是从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检查结果,并查看运行时间。

根据您的评论,我认为您对unique的行为感到困惑。正如@mnel解释的那样,它(unique.data.frame)会从给定的data.frame中删除所有重复的行。它适用于您的情况,因为您说x1x2将具有相同的每个ID的值。因此,必须知道data.frame ID中的位置。您只需为每个ID选择1行。< / p>