r 计算每个变量每个 ID 的非缺失条目数

r count the number of nonmissing entries per variable per ID

假设这是我的数据集

ID      Creatinine   Albumin   Calcium
1       12.2         10.1      NA
1       10.3          8.3      0.33
2       NA           11.12     0.56
2       5.6           9.6      0.14
2       NA            NA       NA
3       4.2          10.16     0.67
3       NA           12.84     0.45
4       NA           NA        0.72

我有兴趣创建一个计数摘要,指示每个 ID 测量给定变量的次数,就像这样

ID      Creatinine   Albumin   Calcium
1       2            2         1    
2       2            2         2  
3       1            2         2
4       NA           NA        1

非常感谢有关此的任何建议。

我认为有一种更简洁的基础 R 方法,但这里有一个使用 dplyr 的方法:

library(dplyr)
df %>%
  group_by(ID) %>%
  summarize(across(everything(), ~sum(!is.na(.))))


# A tibble: 4 × 4
     ID Creatinine Albumin Calcium
  <int>      <int>   <int>   <int>
1     1          2       2       1
2     2          1       2       2
3     3          1       2       2
4     4          0       0       1

这是一个基本的 R 解决方案:

t(sapply(split(df[-1], f = df$ID), function(x) colSums(!is.na(x))))

输出

  Creatinine Albumin Calcium
1          2       2       1
2          1       2       2
3          1       2       2
4          0       0       1

数据

df <-
  structure(
    list(
      ID = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 4L),
      Creatinine = c(12.2, 10.3, NA, 5.6, NA, 4.2, NA, NA),
      Albumin = c(10.1, 8.3, 11.12,
                  9.6, NA, 10.16, 12.84, NA),
      Calcium = c(NA, 0.33, 0.56, 0.14,
                  NA, 0.67, 0.45, 0.72)
    ),
    class = "data.frame",
    row.names = c(NA,-8L)
  )

data.table解决方案

library(data.table)
setDT(dt)

dt[ , lapply(.SD, function(x) sum(!is.na(x))), by = ID, .SDcols = !"ID"]

#    ID Creatinine Albumin Calcium
# 1:  1          2       2       1
# 2:  2          1       2       2
# 3:  3          1       2       2
# 4:  4          0       0       1

如果您确实希望零计数显示为 NA

dt[ , lapply(.SD, function(x) { x <- sum(!is.na(x)); if (x == 0) x <- as.integer(NA); x }), by = ID, .SDcols = !"ID"]

#    ID Creatinine Albumin Calcium
# 1:  1          2       2       1
# 2:  2          1       2       2
# 3:  3          1       2       2
# 4:  4         NA      NA       1