【问题标题】:How to count number of times logical condition is met per column using dplyr如何使用 dplyr 计算每列满足逻辑条件的次数
【发布时间】:2021-08-13 20:39:16
【问题描述】:

我有一个包含一些值的数据框,我想在其中检查每一列,计算满足逻辑条件的次数。 我可以在基础 R 中管理它,但是我正在努力使用 dplyr 包。

一个示例数据框:

A = c(12,30,7,3,13) 
B = c(23,26,45,9,15) 
C = c(12,6,17,35,8)
D = c(22,10,9,20,16) 
X = c(45,24,77,83,27) 
df<- data.frame(A, B, C, D, X)


> A   B   C   D   X
  12  23  12  22  45
  30  26  6   10  24
  7   45  17  9   77
  3   9   35  20  83
  13  15  8   16  27

我想返回列 A 到 D 的行数,其中所述列和 X 之间的某些操作返回 TRUE,例如: (2 * Col) + X > 90 的出现次数,

在基础 R 中,您可以执行以下操作:

sum((2*df$A) - df$X > 90)

返回在 A 列中满足条件的次数,然后对 B、C 和 D 重复。

我想知道在 dplyr 中是否有更简洁的方法来执行此操作,以返回一些数据,例如:

A   B   C   D
1   3   2   2   

其中这些值表示每列中满足条件的次数。

任何帮助将不胜感激!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我将使用2 * A:D + X,因为- X 不会产生任何结果。无论如何,您的预期输出更好地匹配+ ...

    基础 R

    colSums(2*subset(df, select=A:D) + df$X > 90)
    # A B C D 
    # 1 3 2 2 
    

    这是一个命名向量,而不是一个框架。

    dplyr

    library(dplyr)
    colSums(2*select(df, A:D) + df$X > 90)
    

    返回命名向量,就像基本 R 版本一样。如果你想要一个框架,那么

    summarize(df, across(A:D, ~ sum(2*. + X > 90)))
    #   A B C D
    # 1 1 3 2 2
    

    【讨论】:

    • 出色的响应,这正是我所需要的。谢谢!
    【解决方案2】:

    我认为在dplyr 中你可以这样做:

    df %>% summarise(across(A:D, ~sum(2*. + X > 90)))
    

    虽然对于这样的事情我很喜欢使用purrr::map_df:

    select(df, -X) %>% map_df(~sum(2*. + df$X > 90))
    

    【讨论】:

    • 这不会产生预期的输出。
    • 我只是懒惰并置于不同的条件下,因为在原始问题中,条件sum((2*df$A) - df$X &gt; 90) 与预期的输出不匹配(它只是给出全零)。更新为实际输出预期的内容。
    • 我理解并同意,不一致的数据/输出可能会造成混淆。但是,这样做时,通常最好保留公式的“复杂性”;在这种情况下,它将公式中的所有非X 变量与X 进行比较,因此everything() 立即成为非首发。你的编辑已经纠正了它,很好。 (感谢您的建议,我没有评论为什么我也更改了公式 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多