簡體   English   中英

有條件地合並列,r

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM