假设我有一个包含三列的数据框。
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)))