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

问题描述 投票:1回答:2

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

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
r multiple-columns multiple-conditions
2个回答
2
投票

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

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

或转置数据集,进行比较并转置

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

5
投票

此方法适用于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)))
© www.soinside.com 2019 - 2024. All rights reserved.