我有一个包含患者生存数据的数据框。我有一个专栏有时间进行跟进,有一段时间可用。如果患者死亡,时间的数值将列在死亡时间列,而不是在最后一次跟进列的时间;如果病人还活着,反之亦然。相反的栏目,所以如果病人还活着,我指的是死亡栏,有一个" [不可用]"字符串而不是时间组件。这是一个例子:
follow up death
100 [Not Available]
[Not Available] 300
2000 [Not Available]
我想有条件地将两列合并为一个列,只保留这样的数值:
Time
1000
300
2000
修改
为了使其更广泛适用,并适用于我所拥有的其他一些数据集,想象一下" [Not Available]"不一致。因为它可能是NA,na,[Not available],null等。在这种情况下,如何编写条件语句来合并列?我想象一个if语句将保留数值并忽略各种字符串。当然,在数据帧的一列中,数值和字符值都将被分类为字符,这使得这有点困难。想法?
答案 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]"]))