【问题标题】:Count number of groups having a specific value over multiple variables计算在多个变量上具有特定值的组数
【发布时间】:2018-07-13 18:33:18
【问题描述】:

我有一个数据框,例如:

city <- c("a","a","b","b","c","c","c","c","d","e","e","f") 
x <- c(0,0,0,1,1,1,0,0,0,1,1,1)
y <- c(1,1,0,0,0,1,1,0,0,1,0,1)
z <- c(1,0,0,0,0,0,0,0,0,0,1,0)
k <- c(1,1,0,0,0,1,0,0,1,0,0,0)
df <- data.frame(city, x, y, z, k) 

其中有一个分组变量(例如城市)和几个虚拟变量。我想计算每个虚拟变量 = 1 的城市有多少。

到目前为止,我所做的是计算有多少城市有一个特定的虚拟 = 1:

> n_groups(filter(df, x == 1) %>% 
+            group_by(city))
[1] 4

但是,我想知道是否可以对我的数据框中的所有虚拟对象执行此操作,以便获得类似:

var count 
 x   4
 y   4
 z   2
 k   3

其中我有每个虚拟变量等于 1(计数列)的城市数量,而不必为我的样本中的所有虚拟变量单独执行。

感谢您的帮助!

【问题讨论】:

    标签: r grouping


    【解决方案1】:

    R 基础:

    colSums(rowsum(df[, -1], df[, 1]) > 0)
    
    #x y z k 
    #4 4 2 3 
    

    【讨论】:

    • 不知道这个功能rowsum()!
    • 我认为这是这里提出的其他解决方案中更简单的解决方案。
    • stack 包裹起来,您将获得预期的输出格式
    【解决方案2】:

    使用dplyrtidyr

    library(dplyr)
    library(tidyr)
    
    df %>% 
      gather(k, v, -1) %>% 
      filter(v == 1) %>% 
      group_by(k) %>% 
      summarise(cnt = n_distinct(city))
    

    结果:

    # A tibble: 4 x 2
      k       cnt
      <chr> <int>
    1 k         3
    2 x         4
    3 y         4
    4 z         2
    

    【讨论】:

      【解决方案3】:

      使用data.table

      library(data.table)
      setDT(df)
      df[, lapply(.SD, max), city][, colSums(.SD), .SDcols = -1]
      x y z k 
      4 4 2 3 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多