2017-08-01 197 views
0

我有一個數據幀(如下所示)列的值:操縱基於另一列

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_ID具有VALUE s表示對應於兩個LVEF(M-M)LVEF(2D),那麼我們只篩選後者即LVEF(2D)
  2. 如果一個STUD_ID有2個VALUE s對應於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個變量,我想保留它們。

回答

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 
+0

我必須做一些連接,如果我有這三個,我還是想在最後的數據集保留旁邊的其他變量? – HNSKD

+1

這取決於你想要對其他變量進行平均的行 - 你可以在'summarise'中包含它們,或者在'df'結尾包含它們的'left_join'。請注意,如果每個ID有多個,上面的代碼也會對任何「IVSD」或「PASP」行進行平均 - 這可能是也可能不是您想要的。 –