复杂的表计算

时间:2017-08-16 22:31:19

标签: r dataframe grouping

我有一个数据帧df_workingFile:

group  | id  | flag | value |
 a     |  a  |  0   |  5    |  
 a     |  c  |  0   |  2    |  
 b     |  b  |  0   |  8    |  
 b     |  e  |  1   |  1    |  

我希望总结基于组的列,但仅限于 group = id (组中只能有一个这样的实例)。我也不想在总和中包含具有标志的任何值:

group  | id  | flag | value | ValueSum
 a     |  a  |  0   |  5    |   7
 a     |  c  |  0   |  2    |   0
 b     |  b  |  0   |  8    |   8
 b     |  e  |  1   |  1    |   0

输入数据:

df_workingFile <- structure(list(group = structure(c(1L, 1L, 2L, 2L), .Label = c("a", 
"b"), class = "factor"), id = structure(c(1L, 3L, 2L, 4L), .Label = c("a", 
"b", "c", "e"), class = "factor"), flag = c(0, 0, 0, 1), value = c(5, 
2, 8, 1)), .Names = c("group", "id", "flag", "value"), row.names = c(NA, 
4L), class = "data.frame")

3 个答案:

答案 0 :(得分:1)

使用ProjectID | Is Really Cool | Is Awesome ----------------------------------------- 1111 | true | true 2222 | true | 包非常简单。这是我的解决方案:

data.table

在第一个逗号之前,您可以指定逻辑条件。在中间你可以进行列分配(我确信在这种情况下有一个更清洁的解决方案,但它可以工作)。在第二个逗号之后,您可以指定分组声明。我强烈建议熟悉这个包装,这让我的生活变得更加轻松。

答案 1 :(得分:1)

使用dplyr,您可以:

library(dplyr)
d %>% group_by(group) %>% mutate(valueSum=ifelse(flag==0 & group==id,sum(value),0))

  group    id  flag value valueSum
  <chr> <chr> <int> <int>    <dbl>
1     a     a     0     5        7
2     a     c     0     2        0
3     b     b     0     8        9
4     b     e     1     1        0

答案 2 :(得分:1)

在基数R中,您可以avesumrep一起使用0来填写最终值。

df_workingFile$valueSum <-
          with(df_workingFile,
               ave(value * !flag, group, FUN=function(x) c(sum(x), rep(0, length(x)-1))))

返回所需的结果。

df_workingFile
  group id flag value valueSum
1     a  a    0     5        7
2     a  c    0     2        0
3     b  b    0     8        8
4     b  e    1     1        0