如何对数据框的每一列应用不同的条件?
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)))
假设我有一个包含三列的数据框。
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)))