首页 > 解决方案 > 删除最大值小于给定值的列的函数,

问题描述

我正在使用数据框中的 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 个单独的功能吗?

标签: rmax

解决方案


你快到了。

由于您不提供可重现的样本数据,让我们首先创建一些最小的样本数据

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)。


或者我们可以使用pmaxwithapply

df[apply(pmax(df) > 2, 2, all)]

给出相同的结果。与第一种方法的不同之处在于,它pmax返回 a matrix,我们在其上使用 . 逐列操作apply(..., MARGIN = 2, ...)


推荐阅读