基于另一列操作一列的值

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)

  1. 如果 STUD_IDVALUE 同时对应 LVEF(M-M)LVEF(2D),那么我们只过滤后者,即 LVEF(2D)
  2. 如果一个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