[英]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
但是,此代碼忽略列type
的NA
,導致列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.