我有一个使用dplyr
(版本0.2)
我想要ID的累积和var1。它适用于plyr的ddply,但不适用于新的包。这是用户错误吗?如果是这样,任何人都能指出我正确的方向吗?
ID<-c(1,1,1,1,2,2,3,4,4,4,4)
var1<-c(32,55,22,12,34,21,23,42,11,9,20)
df<-data.frame(ID=ID,var1=var1)
df
#does not create cumsum by ID
IDs<-group_by(df,'ID')
transform(IDs,cumsum=cumsum(var1))
ID var1 cumsum
1 1 32 32
2 1 55 87
3 1 22 109
4 1 12 121
5 2 34 155
6 2 21 176
7 3 23 199
8 4 42 241
9 4 11 252
10 4 9 261
11 4 20 281
#works correctly
ddply(.data=df, .variables=('ID'),.fun=transform,cumsum=cumsum(var1))
ID var1 cumsum
1 1 32 32
2 1 55 87
3 1 22 109
4 1 12 121
5 2 34 34
6 2 21 55
7 3 23 23
8 4 42 42
9 4 11 53
10 4 9 62
11 4 20 82
答案 0 :(得分:0)
group_by
更改原始表的类和属性(偶尔会添加列)。
如果您为新表提供的功能无法识别(通常情况下,如果它不是dplyr
动词),它会将其视为常规的未分组表。
transform(IDs,cumsum=cumsum(var1))
mutate(IDs,cumsum=cumsum(var1))
将无法正常工作。
do
是一个dplyr
动词,因此do(IDs,transform(., cumsum = cumsum(var1)))
也可以使用。
分组表的类和属性:
ID<-c(1,1,1,1,2,2,3,4,4,4,4)
var1<-c(32,55,22,12,34,21,23,42,11,9,20)
df<-data.frame(ID=ID,var1=var1)
IDs<-group_by(df,ID) # without quotes!
class(IDs)
# [1] "grouped_df" "tbl_df" "tbl" "data.frame"
attributes(IDs)
# $names
# [1] "ID" "var1"
#
# $row.names
# [1] 1 2 3 4 5 6 7 8 9 10 11
#
# $class
# [1] "grouped_df" "tbl_df" "tbl" "data.frame"
#
# $vars
# [1] "ID"
#
# $drop
# [1] TRUE
#
# $indices
# $indices[[1]]
# [1] 0 1 2 3
#
# $indices[[2]]
# [1] 4 5
#
# $indices[[3]]
# [1] 6
#
# $indices[[4]]
# [1] 7 8 9 10
#
#
# $group_sizes
# [1] 4 2 1 4
#
# $biggest_group_size
# [1] 4
#
# $labels
# ID
# 1 1
# 2 2
# 3 3
# 4 4
这是一个奖励基础R解决方案:
do.call(rbind,by(df,df$ID,function(IDs){transform(IDs,cumsum=cumsum(var1))}))