如何对数据框的每一列应用不同的条件?

How to apply different conditions to each column of a dataframe?

假设我有一个包含三列的数据框。

a <- c(1,2,3,4)
b <- c(2,4,6,8)
c <- c(3,6,9,12)
df <- cbind(a,b,c)
df

这给你...

     a b  c
[1,] 1 2  3
[2,] 2 4  6
[3,] 3 6  9
[4,] 4 8 12

现在假设我想创建一个新数据框,如果该值大于列均值,则取值为 TRUE,如果小于列均值,则取值为 FALSE。

如果我使用以下命令,它会使用整个数据帧的平均值。

large <- df > mean(df)
large

所以我得到...

         a     b     c
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE  TRUE
[3,] FALSE  TRUE  TRUE
[4,] FALSE  TRUE  TRUE

我想得到

         a     b     c
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE FALSE
[3,] TRUE  TRUE  TRUE
[4,] TRUE  TRUE  TRUE

mean获取整个matrix的单个值,我们需要colMeans

df > colMeans(df)[col(df)]

或者转置数据集,做比较和转置

t(t(df) > colMeans(df))

此方法适用于 data.frames 和矩阵(您的示例 df 实际上是矩阵,而不是 data.frame)

sweep(df, 2, colMeans(df), '>')
#          a     b     c
# [1,] FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE
# [3,]  TRUE  TRUE  TRUE
# [4,]  TRUE  TRUE  TRUE

或者,按照@markus 的建议(相同的输出,也适用于矩阵和 data.frames)

scale(df, scale = FALSE) > 0

如果它实际上是一个 data.frame,我相信使用下面的 Map 比上面的方法更快。但是,如果它是一个矩阵,那么使用 Map 根本不起作用。

as.data.frame(Map('>', df, colMeans(df)))