r - 根据数据框中的自定义规则计算总和

标签 r dplyr data.table

最好使用data.table在 R 中:我想计算 DIAM 的总和通过ID , CYCLE #基于以下规则:

  1. 如果有 DIAM对于特定主题周期,表示为 NE然后SUM无法计算(必须返回 NA )
  2. 如果有 DIAM显示为NA ,然后计算总和,忽略 NA (即就好像它是 0)
  3. 如果没有 NA ,然后正常计算总和

我也想替换 CYCLE数字到数字 BASELINE代表0。

dfin <- 
ID    CYCLE     NUM   DIAM
1     BASELINE  1      8
1     BASLEINE  2      4
1     CYCLE 1   1      6
1     CYCLE 1   2      2
1     CYCLE 2   1      6
1     CYCLE 2   2      NE
1     CYCLE 3   1      6
1     CYCLE 3   2      NA

dfout <- 
ID    CYCLE     SUM
1     0         12
1     1         8
1     2         NA
1     3         6

这需要应用于每个科目。有很多循环,但这只是一个例子。

最佳答案

这是一种选择。按“ID”和“CYCLE”的匹配索引(如预期输出中所示)分组,如果 ,则将“DIAM”值更改为 NA任何 'DIAM' 的 具有“NE”,然后通过取 'DIAM' 的 sum 进行汇总,同时确保所有值是否都是 NA 返回NA

library(tidyverse)
dfin %>% 
  group_by(ID, CYCLE = match(CYCLE, unique(CYCLE))-1) %>% 
  mutate(DIAM = as.numeric(replace(DIAM, any(DIAM== "NE"), NA))) %>%
  summarise(SUM = NA^all(is.na(DIAM)) * sum(DIAM, na.rm = TRUE))
# A tibble: 4 x 3
# Groups:   ID [?]
#     ID CYCLE   SUM
#  <int> <dbl> <dbl>
#1     1     0    12
#2     1     1     8
#3     1     2    NA
#4     1     3     6

或者在 group_by 步骤后使用 if/else 条件

dfin %>%
  group_by(ID, CYCLE = match(CYCLE, unique(CYCLE))-1)  %>% 
  summarise(SUM = if("NE" %in% DIAM) NA else sum(as.numeric(DIAM), na.rm = TRUE))

或者对 data.table 使用相同的逻辑

library(data.table)
setDT(dfin)[, .(SUM = if("NE" %in% DIAM) NA_real_ else 
   sum(as.numeric(DIAM), na.rm = TRUE)), .(ID, CYCLE = rleid(CYCLE)-1)]
#   ID CYCLE SUM
#1:  1     0  12
#2:  1     1   8
#3:  1     2  NA
#4:  1     3   6

数据

dfin <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
  CYCLE = c("BASELINE", 
 "BASELINE", "CYCLE 1", "CYCLE 1", "CYCLE 2", "CYCLE 2", "CYCLE 3", 
 "CYCLE 3"), NUM = c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), DIAM = c("8", 
 "4", "6", "2", "6", "NE", "6", NA)), row.names = c(NA, -8L), 
 class = "data.frame")

关于r - 根据数据框中的自定义规则计算总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53076639/

相关文章:

windows - 在不弹出命令提示符的情况下以批处理模式运行 R 脚本

R : How can I get all combinations from a bigger set to a smaller set?

r - 剪切列并将其与 r 中的数据框进行 rbind

r - 将列值转换为 R 中的日期

r - 使用 R 中 'na.strings' 函数的 'colClasses' 和 'fread' 参数读取数据时,列模式错误

r - 如何使用 rworldmap 缩小 map 和标题之间的差距

r - 如何在连续的颜色图例中添加一条线而不是在图中添加一条线?

r - 所有数值变量的平均值的组间差异

r - 具有 613 列调查数据的稀疏 132MB 文件上的 fread segfault

R 数据表 : mean for many columns