有条件地合并列,r

时间:2017-09-20 14:56:10

标签: r

我有一个包含患者生存数据的数据框。我有一个专栏有时间进行跟进,有一段时间可用。如果患者死亡,时间的数值将列在死亡时间列,而不是在最后一次跟进列的时间;如果病人还活着,反之亦然。相反的栏目,所以如果病人还活着,我指的是死亡栏,有一个" [不可用]"字符串而不是时间组件。这是一个例子:

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

我想有条件地将两列合并为一个列,只保留这样的数值:

Time
1000
300
2000

修改

为了使其更广泛适用,并适用于我所拥有的其他一些数据集,想象一下" [Not Available]"不一致。因为它可能是NA,na,[Not available],null等。在这种情况下,如何编写条件语句来合并列?我想象一个if语句将保留数值并忽略各种字符串。当然,在数据帧的一列中,数值和字符值都将被分类为字符,这使得这有点困难。想法?

6 个答案:

答案 0 :(得分:4)

我们可以使用coalesce包中的dplyr

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

答案 1 :(得分:3)

以下是base R

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

答案 2 :(得分: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

答案 3 :(得分: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))

答案 4 :(得分:0)

将它们转换为数字并用0替换NA和算术和应该得到所需的输出。

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

答案 5 :(得分:0)

使用apply:

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]"]))