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
假设这是我的数据集
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