[英]conditionally merge columns, r
我有一個包含患者生存數據的數據框。 我有一個關於最后跟進時間的專欄和一個關於死亡時間的專欄。 如果患者死亡,時間數值將列在死亡時間列中,而不列在最后隨訪時間列中; 如果患者還活着,反之亦然。 相反的列,所以如果病人還活着,我指的是死亡列,有一個“[不可用]”字符串而不是時間部分。 下面是一個例子:
follow up death
100 [Not Available]
[Not Available] 300
2000 [Not Available]
我想有條件地將兩列合並為一列,只保留這樣的數值:
Time
1000
300
2000
編輯
為了使其更廣泛適用,並適用於我擁有的其他一些數據集,想象一下“[不可用]”是否不一致。 因為它可能是 NA、na、[不可用]、空等。在這種情況下,我將如何編寫條件語句來合並列? 想象一個 if 語句將保留數值並忽略各種字符串。 當然,在數據幀的一列中,數值和字符值都將被歸類為字符,這使得這有點困難。 想法?
我們可以使用dplyr
包中的coalesce
。
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
這是一個帶有base R
的選項
dt$Time <- do.call(pmax, c(dt, na.rm = TRUE))
dt$Time
#[1] 1000 300 2000
您可以使用dplyr
的矢量化if_else
函數來實現您需要的效果。 這是文檔頁面。
試試下面的:
library(tidyverse)
t1 <- data_frame("follow up" = c(1000, NA, 2000),
"death" = c(NA, 300, NA))
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
這個答案不使用邏輯運算符或 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 應該會給出所需的輸出。
> 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
>
使用申請:
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]"]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.