R 复杂的表格计算
我有一个数据帧df_工作文件:R 复杂的表格计算,r,dataframe,grouping,R,Dataframe,Grouping,我有一个数据帧df_工作文件: group | id | flag | value | a | a | 0 | 5 | a | c | 0 | 2 | b | b | 0 | 8 | b | e | 1 | 1 | 我想对基于组的值列进行求和,但仅限于group=id的行(按组只能有一个实例)。我也不想在总和中包含任何带有标志的值: 输入数据: df_workin
group | id | flag | value |
a | a | 0 | 5 |
a | c | 0 | 2 |
b | b | 0 | 8 |
b | e | 1 | 1 |
我想对基于组的值列进行求和,但仅限于group=id的行(按组只能有一个实例)。我也不想在总和中包含任何带有标志的值:
输入数据:
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")
df_工作文件使用data.table
包非常简单。以下是我的解决方案:
library(data.table)
temp <- data.table(group = c("a","a","b","b"),
id = c("a","c","b","d"),
flag = c(0,0,0,1),
value = c(5,2,8,1))
temp[flag != 1,ValueSum := ifelse(group == id,sum(value), NA), by = group]
库(data.table)
温度使用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
库(dplyr)
d%%>%group_by(group)%%>%mutate(valueSum=ifelse(flag==0&group==id,sum(value),0))
组id标志值valueSum
1 a 0 5 7
2 a c 0 2 0
3B089
4 b e 11 0
在基数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))))
请dput(head(df\u工作文件))
并粘贴到问题中。看,当然了,这似乎和我的数据框不起作用。我想这是因为您将您的内容作为data.table加载,所以我得到了一个错误。有什么想法吗?是的,用as.data.table.no将其转换为data.table这仍然会产生错误。试一下我的输入数据这会给我错误(“因素的水平集不同”)-想参考我提供的数据吗?另外,这不是什么大问题,但是第3行的值sum理想情况下应该是8(sum仅对未标记的行发生),这是因为您的数据帧中有一些因子。构造或读取数据帧时,精确stringsAsFactors=F。否则,您可以添加d$group=as.character(d$group)
和d$id=as.character(d$id)
。
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