问题描述
我正在尝试仅将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"
如果第一列已经是字符,则不会发生NA
从NA_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%