首页 > 解决方案 > 应用函数产生错误的答案

问题描述

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

这是一个例子。

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

标签: rapplylapply

解决方案


不建议applydata.frame具有不同类的 a 上使用。推荐的选项是lapply。问题是apply,它转换为matrix,这可能会导致一些问题,尤其是当涉及缺失值时,即创建额外的空格。

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

相反,如果第一列已经是字符,则不会发生从to的NA转换,即NA_real_NA_character_

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

一个选项是包装trimws以删除leading空格

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

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


推荐阅读