簡體   English   中英

如何在ifelse中包含NA?

[英]How to include NA in ifelse?

我正在嘗試根據其他列的值的邏輯語句創建列ID 例如,在以下數據框中

test <- structure(list(time = c(10L, 20L, NA, 30L), type = structure(c(1L, 
2L, 3L, NA), .Label = c("A", "B", "C"), class = "factor"), ID = c(NA, 
"1", NA, NA)), .Names = c("time", "type", "ID"), row.names = c(NA, 
-4L), class = "data.frame")

看起來像

    time    type
1   10      A
2   20      B
3   NA      C
4   30      NA

我想創建一個新的列ID其中所有time都不是NA並且所有type都不是A 我為此使用以下代碼:

test$ID <- ifelse(is.na(test$time) | test$type == "A", NA, "1")

這給出了結果

    time    type    ID
1   10      A       NA
2   20      B       1
3   NA      C       NA
4   30      NA      NA

但是,此代碼忽略列typeNA ,導致列ID中的值為NA 我需要這個值為 1,所以我需要的解決方案應該給出:

    time    type    ID
1   10      A       NA
2   20      B       1
3   NA      C       NA
4   30      NA      1

誰能告訴我我該怎么做? 如果我能以某種方式改變is.na(test$type)以返回FALSE而不是TRUE ,我可以is.na(test$type)與我現有的代碼一起工作,但我不知道如何做到這一點。 或者,也許我現有代碼的結構需要完全改變? 我感謝任何幫助!

您無法真正將NA與另一個值進行比較,因此使用==不起作用。 考慮以下:

NA == NA
# [1] NA

您可以將比較從==更改為%in%

ifelse(is.na(test$time) | test$type %in% "A", NA, "1")
# [1] NA  "1" NA  "1"

關於你的另一個問題,

如果我能以某種方式改變is.na(test$type)以返回FALSE而不是TRUE ,我可以is.na(test$type)與我現有的代碼一起工作,但我不知道如何做到這一點。

就用! 否定結果:

!is.na(test$time)
# [1]  TRUE  TRUE FALSE  TRUE

聽起來您希望 ifelse 語句在比較中將 NA 值解釋為 FALSE 而不是 NA 。 我使用以下函數來處理這種情況,因此我不必連續處理 NA 情況:

falseifNA <- function(x){
  ifelse(is.na(x), FALSE, x)
}

ifelse2 <- function(x, a, b){
  ifelse(falseifNA(x), a, b)
}

您也可以將這些功能合二為一以提高效率。 所以要返回你想要的結果,你可以使用:

test$ID <- ifelse2(is.na(test$time) | test$type == "A", NA, "1")

@AnandaMahto 已經解決了您獲得這些結果的原因,並提供了獲得所需內容的最清晰方法。 但另一種選擇是使用identical而不是==

test$ID <- ifelse(is.na(test$time) | sapply(as.character(test$type), identical, "A"), NA, "1")

或使用isTRUE

test$ID <- ifelse(is.na(test$time) | Vectorize(isTRUE)(test$type == "A"), NA, "1")

所以,我聽說這有效:

Data$X1<-as.character(Data$X1)
Data$GEOID<-as.character(Data$BLKIDFP00)
Data<-within(Data,X1<-ifelse(is.na(Data$X1),GEOID,Data$X2)) 

但我承認我只有間歇性的運氣。

您也可以嘗試使用 elseif。

x <- 1
if (x ==1){
    print('same')
} else if (x > 1){
    print('bigger')
} else {
    print('smaller')
}

暫無
暫無

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

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