R 复杂的表格计算

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

我有一个数据帧df_工作文件:

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