【问题标题】:How to apply different conditions to each column of a dataframe?如何对数据框的每一列应用不同的条件?
【发布时间】:2020-03-08 15:51:45
【问题描述】:

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

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


    【解决方案1】:

    此方法适用于 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)))
    

    【讨论】:

    • 不知道这是否更好,但您可以将此选项添加到您的帖子中:scale(df, scale = FALSE) &gt; 0
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢。现在,如果它是一个不同的统计数据,比如标准差呢?
    • @PashaS。您可以使用df &gt; apply(df, 2, sd)[col(df)]。或带有library(matrixStats) df &gt; colSds(df)[col(df)]的矢量化选项
    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多