我正在尝试通过名为的函数进行等效的group by摘要.我有一个数据框,有三列(比方说,和).然后,我想计算每个出现在数据框中的时间(带)并获取每个对应于列的最后一个元素.Rplyrddplyidperiodeventidcount(*)... group by idSQLidevent
这是我拥有的和我想要获得的内容的一个例子:
id period event #original data frame
1 1 1
2 1 0
2 2 1
3 1 1
4 1 1
4 1 0
id t x #what I want to obtain
1 1 1
2 2 1
3 1 1
4 2 0
Run Code Online (Sandbox Code Playgroud)
这是我用过的简单代码:
teachers.pp<-read.table("http://www.ats.ucla.edu/stat/examples/alda/teachers_pp.csv", sep=",", header=T) # whole data frame
datos=ddply(teachers.pp,.(id),function(x) c(t=length(x$id), x=x[length(x$id),3])) #This is working fine.
Run Code Online (Sandbox Code Playgroud)
现在,我一直在阅读用于数据分析的Split-Apply-Combine策略,并给出了一个示例,他们使用了与我下面的语法相同的语法:
datos2=ddply(teachers.pp,.(id), summarise, t=length(id), x=teachers.pp[length(id),3]) #using summarise but the result is not what I want.
Run Code Online (Sandbox Code Playgroud)
这是我使用的数据框架 datos2
id t x
1 1 1
2 2 0
3 1 1
4 1 1
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:为什么这个结果与我使用第一段代码的结果不同,我的意思是datos1?我究竟做错了什么?
当我不得不使用summarise或时,我不清楚transform.你能告诉我这个ddply函数的正确语法吗?
使用时summarise,请停止引用原始数据框.相反,只需根据列名称编写表达式.
你试过这个:
ddply(teachers.pp,.(id), summarise, t=length(id), x=teachers.pp[length(id),3])
Run Code Online (Sandbox Code Playgroud)
当你可能想要的东西更像是这样的东西:
ddply(teachers.pp,.(id), summarise, t=length(id), x=tail(event,1))
Run Code Online (Sandbox Code Playgroud)