2017-09-20 99 views
1

我有一個包含患者生存數據的數據框。我有一個時間最後的專欄和一個時間死亡專欄。如果病人死亡,時間的數值將在死亡時間列中列出,而不是在最後一次隨訪時間列中;如果病人還活着,反之亦然。相反的列,所以如果患者還活着,我指的是死亡專欄,有一個「[Not Available]」字符串而不是時間分量。這裏有一個例子:有條件合併列,r

follow up   death 
     100   [Not Available] 
[Not Available]   300 
     2000   [Not Available] 

我想了兩列有條件合併成一列保存就這樣的數值:

Time 
1000 
300 
2000 

編輯

爲了更廣泛地應用使這並且適用於我擁有的其他數據集,請想象一下「[Not Available]」是否一致。因爲它可能是NA,na,[不可用],null等等。在這種情況下,我將如何編寫條件語句來合併列?我想象一個if語句,它將保留數值並忽略各種字符串。當然,在數據框的一列中,數字和字符值都將被分類爲字符,這使得這一點變得更加困難。想法?

+2

退房'dplyr :: COALESCE('。在將來,如果你提供一個[可重現的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),可以更容易地幫助你,複製/粘貼到R進行測試。 – MrFlick

回答

4

我們可以使用dplyr包中的​​3210。

library(dplyr) 

dt <- data_frame("follow up" = c(1000, NA, 2000), 
       "death" = c(NA, 300, NA)) 

dt2 <- dt %>% 
    mutate(Time = coalesce(.$`follow up`, .$death)) 

dt2 
# A tibble: 3 x 3 
    `follow up` death Time 
     <dbl> <dbl> <dbl> 
1  1000 NA 1000 
2   NA 300 300 
3  2000 NA 2000 
+0

在這個答案中,我必須首先將所有「[Not Available]」字符串轉換爲NAs嗎? –

+0

@Phil_T是的。類似於'dt [dt =='[Not Available]「] < - NA' – www

+0

我更喜歡'tidyr :: gather(dt,event,time,na.rm = TRUE)' - 減少寫作的麻煩和更多可用格式。 – Frank

1

嘗試以下:

library(tidyverse) 

follow_up <- c('100', 'NA', '2000') 
death <- c('NA', '300', 'NA') 

t1 <- tibble(follow_up, death) 
t2 <- t1 %>% 
    mutate(Time = if_else(death != 'NA', death, follow_up)) 

Result: 
    follow_up death Time 
     <chr> <chr> <chr> 
1  100 NA 100 
2  NA 300 300 
3  2000 NA 2000 
0

這個答案不使用邏輯運算符或if語句(如果你能提供確實的答案,我將不勝感激),但它的工作原理:

Data2$followup <- gsub("[Not Available]", "", Data2$followup) 
Data2$death <- gsub("[Not Available]", "", Data2$death) 
Data2$time <- paste(Data2$followup, Data2$death, sep = "") 
Data2$time <- gsub("\\[", "", gsub("\\]", "", Data2$time)) 
0

將它們轉換爲數字並將NA替換爲0和算術和應該給出所需的輸出。

> ss <- data.frame(follow_up = c('100','[Not Available]','2000'),death = c('[Not Available]','300','[Not Available]')) 
> 
> ss <- lapply(ss, function(x){ifelse(x == '[Not Available]', 0, as.numeric(x))}) 
Warning messages: 
1: In ifelse(x == "[Not Available]", 0, as.numeric(x)) : 
    NAs introduced by coercion 
2: In ifelse(x == "[Not Available]", 0, as.numeric(x)) : 
    NAs introduced by coercion 
> 
> ss$new <- ss$follow_up + ss$death 
> 
> data.frame(ss) 
    follow_up death new 
1  100  0 100 
2   0 300 300 
3  2000  0 2000 
> 
3

這裏是base R

dt$Time <- do.call(pmax, c(dt, na.rm = TRUE)) 
dt$Time 
#[1] 1000 300 2000 
0

選項用途適用:)

df <- data.frame("follow up" = c("1000", "[Not Available]", "2000"), 
       "death"  = c("[Not Available]", "300", "[Not Available]")) 

df$Time <- apply(df, 1, function(row) as.numeric(row[row!="[Not Available]"]))