Apply函数产生错误的答案

问题描述

我正在尝试仅将0或1替换那些列的所有NA。但是,我发现apply无法处理NA。如果我将NA替换为任意字符串,即“未知”。然后套用,套用产生相同的结果。任何解释将不胜感激。

这里是一个例子。

df<-data.frame(a=c(0,1,NA),b=c(0,0),c=c('d',NA,'c'))
apply(df,2,function(x){all(x %in% c(0,NA)) })
unlist(lapply(df,NA))}))

解决方法

不建议在具有不同类的apply上使用data.frame。推荐的选项是lapply。问题是apply会转换为matrix,这会导致某些问题,尤其是在涉及缺失值(例如,创建多余的空格)的情况下。

apply(df,2,I)
#     a    b   c  
#[1,] " 0" "0" "d"
#[2,] " 1" "1" NA 
#[3,] NA   "0" "c"

如果第一列已经是字符,则不会发生NANA_real_NA_character_的转换,即

df1 <- df
df1$a <- as.character(c(0,1,NA))
apply(df1,I)
 #    a   b   c  
#[1,] "0" "0" "d"
#[2,] "1" "1" NA 
#[3,] NA  "0" "c"

一个选择是用trimws包装以除去leading空格

apply(df,function(x){all(trimws(x) %in% c(0,NA)) })
#    a     b     c 
# TRUE  TRUE FALSE 

注意:为了测试NA的存在,建议使用is.na代替%in%