【问题标题】:Manipulate Values of a Column Based on Another Column基于另一列操作列的值
【发布时间】: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)

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


    【解决方案1】:

    这可以满足您的需求...

    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
    

    【讨论】:

    • 如果除了这 3 个变量之外我还想在最终数据集中保留其他变量,我是否必须进行一些连接?
    • 这取决于您希望对平均行的其他变量发生什么 - 您可以将它们包含在 summariseleft_join 中,最后从 df 中包含它们。请注意,如果每个 ID 有多个行,上述代码还会对任何 IVSDPASP 行进行平均 - 这可能是您想要的,也可能不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2021-06-10
    相关资源
    最近更新 更多