基于另一列操作一列的值
Manipulate Values of a Column Based on Another Column
我有一个如下所示的数据框:
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
有 VALUE
同时对应 LVEF(M-M)
和 LVEF(2D)
,那么我们只过滤后者,即 LVEF(2D)
。
- 如果一个
STUD_ID
有2个VALUE
对应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 个变量之外的其他变量,我希望保留它们。
这正是您想要的...
df2 <- df %>% group_by(STUD_ID,MEAS) %>%
summarise(VALUE=mean(VALUE)) %>%
group_by(STUD_ID) %>% mutate(TEMP2D=("LVEF(2D)" %in% MEAS)) %>%
filter(!(MEAS=="LVEF(M-M)" & TEMP2D)) %>%
select(-TEMP2D)
df2
# A tibble: 6 x 3
# Groups: STUD_ID [4]
STUD_ID MEAS VALUE
<int> <chr> <dbl>
1 1 LVEF(2D) 66
2 2 IVSD 63
3 2 LVEF(2D) 54
4 3 LVEF(M-M) 50
5 4 LVEF(2D) 71
6 4 PASP 55
我有一个如下所示的数据框:
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
有VALUE
同时对应LVEF(M-M)
和LVEF(2D)
,那么我们只过滤后者,即LVEF(2D)
。 - 如果一个
STUD_ID
有2个VALUE
对应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 个变量之外的其他变量,我希望保留它们。
这正是您想要的...
df2 <- df %>% group_by(STUD_ID,MEAS) %>%
summarise(VALUE=mean(VALUE)) %>%
group_by(STUD_ID) %>% mutate(TEMP2D=("LVEF(2D)" %in% MEAS)) %>%
filter(!(MEAS=="LVEF(M-M)" & TEMP2D)) %>%
select(-TEMP2D)
df2
# A tibble: 6 x 3
# Groups: STUD_ID [4]
STUD_ID MEAS VALUE
<int> <chr> <dbl>
1 1 LVEF(2D) 66
2 2 IVSD 63
3 2 LVEF(2D) 54
4 3 LVEF(M-M) 50
5 4 LVEF(2D) 71
6 4 PASP 55