这是我的数据:
> head(Kandula_for_n)
date dist date_only
1 2005-05-08 12:00:00 138.5861 2005-05-08
2 2005-05-08 16:00:00 1166.9265 2005-05-08
3 2005-05-08 20:00:00 1270.7149 2005-05-08
6 2005-05-09 08:00:00 233.1971 2005-05-09
7 2005-05-09 12:00:00 1899.9530 2005-05-09
8 2005-05-09 16:00:00 726.8363 2005-05-09
Run Code Online (Sandbox Code Playgroud)
我现在想要一个额外的列,每天有数据条目(dist)的count(n).对于2005-05-08,这将是n = 3,因为在12,16和20时有3个数据条目.我已应用以下代码实际上给了我想要的我想要的代码:
ndist <-tapply(1:NROW(Kandula_for_n), Kandula_for_n$date_only, function(x) length(unique(x)))
Run Code Online (Sandbox Code Playgroud)
之后ndist<-as.data.frame(ndist),我得到了这个:
> head(ndist)
ndist
2005-05-08 3
2005-05-09 4
2005-05-10 6
2005-05-11 4
2005-05-12 6
2005-05-13 6
Run Code Online (Sandbox Code Playgroud)
问题是计数与date_only一起被称为ndist.但是我需要在两个单独的列中使用它们,一个带有count,另一个带有date_only.如何才能做到这一点?我想它相当简单,但我只是不明白.如果你能给我任何想法,我将不胜感激.
谢谢你的努力.
仅仅因为我发现tapply()很难包裹我的大脑,我喜欢使用plyr这些类型的东西:
## make up some data
## you get better/faster/more answers if you do this bit for us :)
dates <- seq(Sys.Date(), Sys.Date() + 5, by = 1)
Kandula_for_n <- data.frame(date_only = sample( dates + 5, 10, replace=TRUE ) , dist=rnorm(10) )
require(plyr)
ddply(Kandula_for_n, "date_only", function(x) data.frame(x, ndist=nrow(x)) )
Run Code Online (Sandbox Code Playgroud)
这会给你一些类似的东西:
date_only dist ndist
1 2011-10-30 0.2434168 5
2 2011-10-30 -0.9361780 5
3 2011-10-30 1.4593197 5
4 2011-10-30 -0.1851402 5
5 2011-10-30 0.6652419 5
6 2011-10-31 0.8876420 1
7 2011-11-03 0.5087175 2
8 2011-11-03 -1.0065152 2
9 2011-11-04 0.4236352 2
10 2011-11-04 0.4535686 2
Run Code Online (Sandbox Code Playgroud)
这ddply条线:
ddply(Kandula_for_n, "date_only", function(x) data.frame(x, ndist=nrow(x)) )
获取输入数据,按date.only字段对其进行分组,对于每个唯一值,它将匿名函数应用于仅由具有相同值的记录组成的数据帧date_only.我的匿名函数只需要获取data.frame x并附加一个名为ndistwhich 的列,该列是行数x.
这些只是行名称。你可以走了:
ndist$date = row.names(ndist)
Run Code Online (Sandbox Code Playgroud)
编辑:或ndist = data.frame(date = names(ndist), ndist)取决于它是否已经是数据帧。