2017-09-20 97 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]"]))