我有示例数据框
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"))
x1
和x2
变量在每个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
非常感谢
答案 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
中删除所有重复的行。它适用于您的情况,因为您说x1
和x2
将具有相同的每个ID
的值。因此,不必须知道data.frame
ID
中的位置。您只需为每个ID选择1行。< / p>