2016-01-16 79 views
2

我有一個數據幀,mydata,構造如下:如何處理if else語句中的缺失值?

col1<-c(8.20e+07, 1.75e+08, NA, 4.80e+07, 
     3.40e+07, NA, 5.60e+07, 3.00e+06) 
col2<-c(1960,1960,1965,1986,1960 
     ,1969,1960,1993) 
col3<-c (NA,2.190,NA,NA, 5.000, NA, 
      1.700,4.220) 
mydata<-data.frame(col1,col2,col3) 

mydata 

#  col1 col2 col3 
# 1 8.20e+07 1960 NA 
# 2 1.75e+08 1960 2.19 
# 3  NA 1965 NA 
# 4 4.80e+07 1986 NA 
# 5 3.40e+07 1960 5.00 
# 6  NA 1969 NA 
# 7 5.60e+07 1960 1.70 
# 8 3.00e+06 1993 4.22 

我想創建一個col4具有值"a", "b" and "c", 如果col1比4.00E + 07,然後col4=="a"小;如果col1不小於4.00E + 07,然後col4=="b",否則col4=="c

這裏是我的代碼:

col4 <-ifelse(col1<4.00e+07, "a",     
     ifelse(col1 >=4.00e+07, "b",       
     ifelse(is.na(col1 =4.00e+07), "b", "c"))) 

但這種計算結果爲:

# [1] "b" "b" NA "b" "a" NA "b" "a" 

它不會改變col1中的NA值爲「c」。

結果應該是:

# [1] "b" "b" "c" "b" "a" "c" "b" "a" 

什麼是我的代碼的問題?任何建議,將不勝感激!

回答

6

您必須首先檢查is.na,因爲NA < 4.00e+07結果爲NA。如果ifelse()第一個參數是NA,其結果將是NA還有:

ifelse(c(NA, TRUE, FALSE), "T", "F") 
## [1] NA "T" "F" 

正如你可以看到,第一個向量元素的結果確實NA。即使ifelse()的其他參數有專門的代碼來處理這種情況,它也無濟於事,因爲該代碼從未被考慮。

對於你的榜樣,檢查NA首先給你所期望的結果:

col4 <- ifelse(is.na(col1), "c", 
       ifelse(col1 < 4.00e+07, "a","b")) 
col4 
## [1] "b" "b" "c" "b" "a" "c" "b" "a" 
3

這可以用cut

v1 <- with(mydata, as.character(cut(col1, 
    breaks=c(-Inf, 4.00e+07, Inf), labels=c("a", "b")))) 
v1[is.na(v1)] <- "c" 
v1 
#[1] "b" "b" "c" "b" "a" "c" "b" "a" 
+0

感謝@akrun也做。一個問題是,不'場所= C(-Inf,4.00E + 07,Inf文件),標籤= C( 「A」, 「B」)'意味着'[4.00E + 07,Inf文件)'將給出一個''b「'的標籤? –

+2

@ eclo.qh是的,你是對的。你可以用'用(MYDATA,切工(COL1,符= C(-Inf,4.00E + 07,天道酬勤)))' – akrun

+1

非常感謝@akrun檢查。 –