r - 应用函数产生错误的答案
问题描述
我正在尝试仅用 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))}))
解决方案
不建议apply
在data.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%
推荐阅读
- picocli - picocli 子命令可以有同名的选项吗?
- malware - 如何使用方案 ftp/ftps 正确去除/解除 URL?
- mongodb - $lookup 不适用于以 $ 开头的字段
- javascript - 如何从 html 中显示的元素列表创建数据对象
- python - 将 .dat 转换为 csv 时,我的代码会更改输出值
- mysql - 我可以在 MainThread 中进行快速 SQL 调用吗?德尔福
- javascript - 为什么这个进度条在更新时会“闪烁”,我该如何解决?
- c# - 如何使用 Appium C# 处理 Android 权限对话
- html - 锚标签继承自非预期元素
- javascript - 是否可以从同一项目中的外部 Javascript 代码访问角度应用程序数据