r - 删除最大值小于给定值的列的函数,
问题描述
我正在使用数据框中的 34,000 列进行初始数据清理,为此,我必须删除最大值小于 2 的列。
我对如何删除最大值小于 2 的列一无所知,但为了获取最大值,我尝试创建如下函数而不使用 is.numeric 转换数据:
protein <- is.numeric(protein)
#a:
colMax <- function(data) sapply(data, max, na.rm = TRUE)
colMax(protein)
我得到了对因子错误没有意义的最大值,这就是我使用 is.numeric 函数将所有数据转换为数字形式的原因。尽管如此,我仍然没有得到想要的结果。运行该函数时,我得到 0 作为结果,而不是每列的最大值列表。
为什么我的 max 函数为 0?如何设置一个函数,该函数可以为每列生成最大值并删除最大值小于 2 的任何列?我需要 2 个单独的功能吗?
解决方案
你快到了。
由于您不提供可重现的样本数据,让我们首先创建一些最小的样本数据
df <- as.data.frame(matrix(rep(1:10, each = 10), ncol = 10))
df
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#1 1 2 3 4 5 6 7 8 9 10
#2 1 2 3 4 5 6 7 8 9 10
#3 1 2 3 4 5 6 7 8 9 10
#4 1 2 3 4 5 6 7 8 9 10
#5 1 2 3 4 5 6 7 8 9 10
#6 1 2 3 4 5 6 7 8 9 10
#7 1 2 3 4 5 6 7 8 9 10
#8 1 2 3 4 5 6 7 8 9 10
#9 1 2 3 4 5 6 7 8 9 10
#10 1 2 3 4 5 6 7 8 9 10
我们现在只想保留max
值大于 2 的列;我们可以使用sapply
df[sapply(df, function(x) max(x, na.rm = T) > 2)]
# V3 V4 V5 V6 V7 V8 V9 V10
#1 3 4 5 6 7 8 9 10
#2 3 4 5 6 7 8 9 10
#3 3 4 5 6 7 8 9 10
#4 3 4 5 6 7 8 9 10
#5 3 4 5 6 7 8 9 10
#6 3 4 5 6 7 8 9 10
#7 3 4 5 6 7 8 9 10
#8 3 4 5 6 7 8 9 10
#9 3 4 5 6 7 8 9 10
#10 3 4 5 6 7 8 9 10
说明:sapply
遍历 的列data.frame
df
并返回一个logical
向量(条目与 中的列一样多df
)。
或者我们可以使用pmax
withapply
df[apply(pmax(df) > 2, 2, all)]
给出相同的结果。与第一种方法的不同之处在于,它pmax
返回 a matrix
,我们在其上使用 . 逐列操作apply(..., MARGIN = 2, ...)
。
推荐阅读
- c# - c#只复制变量的整数值
- java - 原始 HTTP POST 正文使用什么键?
- javascript - 在地图期间获取前一个元素的功能方法
- python-3.x - 复数计算误差随着矩阵大小的增加而增加
- pycharm - PyCharm:社区版的覆盖范围?
- apache - 来自 kubernetes 的前端 traefik 入口中的 httpd 反向代理
- javascript - 如何在传单中加载 SVG 图标?
- java - 如何修复 java.security.cert.CertPathValidatorException:时间戳检查失败
- python - 在 lambda 函数 python 中返回 2 个值
- flutter - 如何在 Flutter 中的选项卡视图上启用禁用编辑模式