2013-01-23 89 views
0

我有这样一个数据帧:如何在R中聚合数据框?

user event score 
1  2  0.5 
1  3  0.2 
2  3  0.7 
3  1  0.9 
3  4  0.1 

,我想要得到的结果是:

user event 
1 2,3 
2 3 
3 1,4 

我怎样才能做到这一点R中?
有时,我认为R在编程语言(如Java或Python)中缺乏基础数据结构会使我的工作变得不方便。

+1

您试图在这里模拟哪种Python数据结构?以用户ID作为键和事件分数列表作为值的字典? – Marius

+0

是的,我只是想建立一个地图作为你的描述。 @Marius –

+1

有时我觉得人们对R数据结构的理解不够,使得我们在教育上的努力不方便。 –

回答

2

假设您的data.frame被称为mydata,做到:

aggregate(event ~ user, mydata, I) 

得到保留的数字表示或

aggregate(event ~ user, mydata, paste, collapse = ", ") 

这贴的值来创建一个特征向量的列表。

这里是如何将这些存储不同的演示:

x1 <- aggregate(event ~ user, mydata, paste, collapse =",") 
x2 <- aggregate(event ~ user, mydata, I) 
x1$event 
# [1] "2,3" "3" "1,4" 
x2$event 
# $`0` 
# [1] 2 3 
# 
# $`1` 
# [1] 3 
# 
# $`2` 
# [1] 1 4 
# 

我个人比较喜欢使用Ipaste,这样我就可以在列中使用lapply()如果我以后需要。

+0

如何将参数sep =“”传递给粘贴功能? –

+0

@jerry_sjtu,你为什么想要/需要?在这里,我使用了'collapse'参数,因为你只是试图从单个向量中“折叠”所有元素。当您将多个向量粘贴在一起时,“sep”参数更适合您。作为一个例子,试试这个:'x < - 1:3; y <-4:6; paste(x,sep =“,”);粘贴(x,collapse =“,”);粘贴(x,y,sep =“,”);粘贴(x,y,collapse =“,”)'。既然你提到'sep =“”',只需用'sep =“”'替换'collapse =“,''或者直接将'paste'替换为无参数。仅供参考:这会将事件列中的数字强制转换为字符。 – A5C1D2H2I1M1N2O1R2T1

1
data.frame(user=unique(dat$user), event=tapply(dat$event, dat$user, c) ) 
# 
    user event 
1 1 2, 3 
2 2  3 
3 3 1, 4 
+0

这条语句的工作原因是因为事件列是按因数dat $ user排序的,并且没有映射关系?这是有趣的,因为我总是试图映射。 –

+0

我不清楚你的意思是“没有映射关系”。确实,它的工作原理是行可以交叉分类,而'unique'函数将保留'tapply'使用的顺序。 –