dplyr不尊重Group_By

时间:2014-07-02 19:36:33

标签: r plyr dplyr

我有一个使用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

1 个答案:

答案 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))}))