最好使用data.table
在 R 中:我想计算 DIAM
的总和通过ID
, CYCLE #
基于以下规则:
- 如果有
DIAM
对于特定主题周期,表示为NE
然后SUM
无法计算(必须返回NA
) - 如果有
DIAM
显示为NA
,然后计算总和,忽略NA
(即就好像它是 0) - 如果没有
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”值更改为
具有“NE”,然后通过取 'DIAM' 的 NA
任何 '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/