【发布时间】:2017-08-01 07:40:36
【问题描述】:
我有一个如下所示的数据框:
df <- read.table(header = TRUE, text =
"STUD_ID MEAS VALUE
1 LVEF(M-M) 69
1 LVEF(2D) 66
2 LVEF(2D) 36
2 LVEF(2D) 72
2 IVSD 63
3 LVEF(M-M) 50
4 LVEF(2D) 71
4 PASP 55", stringsAsFactors = FALSE)
我想关注MEAS,它们要么是LVEF(M-M),要么是LVEF(2D)。
- 如果
STUD_ID的VALUEs 对应于LVEF(M-M)和LVEF(2D),那么我们只过滤后者,即LVEF(2D)。 - 如果一个
STUD_ID有2 个VALUEs 对应于LVEF(2D),那么我们取平均值。
我想要的输出是:
# STUD_ID MEAS VALUE
# 1 LVEF(2D) 66
# 2 LVEF(2D) 54
# 2 IVSD 63
# 3 LVEF(M-M) 50
# 4 LVEF(2D) 71
# 4 PASP 55
我尝试了以下方法,但它给了我一个错误:
df %>%
filter(MEAS == "LVEF(M-M)" | MEAS == "LVEF(2D)") %>%
arrange(STUD_ID, MEAS) %>%
group_by(STUD_ID, MEAS) %>%
mutate(n = n()) %>%
group_by(STUD_ID) %>%
mutate(nd = n_distinct(MEAS)) %>%
mutate(VALUE =
case_when(nd == 2 ~ VALUE[which(MEAS == "LVEF(2D)")],
nd == 1 & n > 1 ~ mean(VALUE),
TRUE ~ VALUE)) %>%
bind_rows(
df %>% filter(MEAS != "LVEF(M-M)" & MEAS != "LVEF(2D)")
)
我的数据框包含除这 3 个变量之外的其他变量,我希望保留它们。
【问题讨论】:
标签: r dplyr data-manipulation tidyr