簡體   English   中英

使用 if else 語句 R 創建一個新字段

[英]Creating a new field with if else statement R

我正在嘗試基於 if else 語句創建一個新字段。 基本上,我有一個“日期”字段和一個“估計日期”字段。 我想創建一個新字段來計算單個事件與日期或估計日期字段(如果日期為 NA)之間的差異(天):

data <- data.frame("DOD" = c("2020-11-09","2020-01-01","2020-11-19",NA), "DOD.est" = c(NA,NA,NA,"2020-02-09"), "event" = c("Thing1","Thing2","Thing3","Thing4"),"eventDate" = c("2019-02-19","2017-08-09",NA,"2019-12-09"))

data$DOD <- as.Date(data$DOD, "%Y-%m-%d")
data$DOD.est <- as.Date(data$DOD.est, "%Y-%m-%d")
data$eventDate <- as.Date(data$eventDate, "%Y-%m-%d")

# If DOD not NA, calculate diff using DOD.  If DOD NA and DOD.est is not NA, use DOD.est to calculate diff
if (!is.na(data$DOD)) {
  data$event_to_death <- as.numeric(data$DOD - data$eventDate) 
} else if (is.na(data$DOD) & !is.na(data$DOD.est)) {
  data$event_to_death <- as.numeric(data$DOD.est - data$eventDate)
} 

我的結果:

DOD           DOD.est        event       eventDate       event_to_death
2020-11-09    NA             Thing1      2019-02-19       629
2020-01-01    NA             Thing2      2017-08-09       875
2020-11-19    NA             Thing3      NA               NA
NA            2020-02-09     Thing4      2019-12-09       NA

對於最后一行,我希望 event_to_death 進行計算,因為 DOD 是 NA 而 DOD.est 不是 NA。 我究竟做錯了什么? 謝謝。

您可以嘗試使用矢量化的ifelse() 函數if()適用於單個值,並且在處理變量時可能會引發問題。 在這種情況下最好使用ifelse 這里的代碼作為您的選項:

#Code
data$event_to_death <- ifelse(!is.na(data$DOD),as.numeric(data$DOD - data$eventDate),
                              ifelse(is.na(data$DOD) & !is.na(data$DOD.est),
                                     as.numeric(data$DOD.est - data$eventDate),NA))

輸出:

data
         DOD    DOD.est  event  eventDate event_to_death
1 2020-11-09       <NA> Thing1 2019-02-19            629
2 2020-01-01       <NA> Thing2 2017-08-09            875
3 2020-11-19       <NA> Thing3       <NA>             NA
4       <NA> 2020-02-09 Thing4 2019-12-09             62

為了使您的解決方案工作,您需要告訴if()需要在值級別(每行)評估條件,因為如果找到向量,則該函數僅用於評估某些值的條件。 您將需要一個循環:

#Variable
data$event_to_death <- NA
#Loop
for(i in 1:nrow(data))
{
  if (!is.na(data$DOD[i])) {
    data$event_to_death[i] <- as.numeric(data$DOD[i] - data$eventDate[i]) 
  } else if (is.na(data$DOD[i]) & !is.na(data$DOD.est[i])) {
    data$event_to_death[i] <- as.numeric(data$DOD.est[i] - data$eventDate[i])
  } 
}

輸出:

data
         DOD    DOD.est  event  eventDate event_to_death
1 2020-11-09       <NA> Thing1 2019-02-19            629
2 2020-01-01       <NA> Thing2 2017-08-09            875
3 2020-11-19       <NA> Thing3       <NA>             NA
4       <NA> 2020-02-09 Thing4 2019-12-09             62

這樣,條件由每個值評估,並且if()正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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