我有一个数据帧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")
答案 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中,您可以ave
与sum
和rep
一起使用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