【问题标题】:How can I find count of rows by each factor level of each column in a dataframe in R?如何按 R 中数据框中每列的每个因子级别查找行数?
【发布时间】:2019-06-04 02:46:46
【问题描述】:

我有几个不同的数据集,它们具有不同数量的因子变量和一个输出变量。对于这些数据集中的每一个,我需要找到按变量的每个因子水平分组并按所有变量(列)进一步分组的观察行数。我认为 for 循环可能会解决问题,但我正在努力解决它。有人可以帮忙吗?

数据集如下所示:

enter image description here

我希望输出为 enter image description here

我试过了

for (i in 1:length(df)){
df %>% group_by(df[[i]]) %>%  summarise(n = length(i))%>%print()

}

但这似乎不起作用

【问题讨论】:

    标签: r for-loop group-by


    【解决方案1】:

    一个选项是将gather 转换为“长”格式,然后执行count

    library(tidyverse)
    gather(df1, Variable,  Factor_Level, var1:var3) %>%
         count(Variable, Factor_Level)
    

    【讨论】:

    • 感谢@akrun。由于我有几个不同的数据集,它们具有不同数量的变量和因子水平,因此我想这样做而不必为每个数据集指定变量名称。你认为循环会对此有所帮助吗?
    • @AnT gather 也可以使用索引而不是列名。 gather(df1, Variable, Factor_Level, 1:3)如果它们在列表中的位置相同。
    【解决方案2】:

    你应该能够做类似的事情

    by(data$x, data$y, function)
    

    data$x 是您要排序的内容,data$y 是您要排序的内容,function 是您要对这些条目执行的操作(fx:平均值、长度、shapiro.test 等)。然后您可以使用as.vector() 将此输出强制转换为向量。

    如果我有一个带有df <- dataframe(ID <- c(1, 1, 1, 1, 2, 2, 3), value <- (10, 20, 30, 40, 50, 60, 70)) 的数据框,那么运行as.vector(by(df$value, df$Id, lengh)) 将返回一个向量(4, 2, 1)

    【讨论】:

      【解决方案3】:

      如果您对列表格式没问题,您可以在创建列表后停止。但是,这是 akrun 提出的 gather 方法的(有些复杂的)替代方案:

      # Getting a vector of factor variables in dataset
      factor_vars <- names(factor_vars)[sapply(mtcars, is.factor)]
      
      # Creating list of frequency tables
      freq_tables <- lapply(factor_vars, function(x) group_by_(mtcars, .dots = x) %>% tally())
      
      freq_tables <- lapply(freq_tables, function(x) cbind(colnames(x)[1], x))
      do.call(rbind, lapply(freq_tables, setNames, c("Factor", "Level", "Count")))
      
         Factor Level Count
      1      vs     0    18
      2      vs     1    14
      3      am     0    19
      4      am     1    13
      5    gear     3    15
      6    gear     4    12
      7    gear     5     5
      8    carb     1     7
      9    carb     2    10
      10   carb     3     3
      11   carb     4    10
      12   carb     6     1
      13   carb     8     1
      

      数据

      mtcars[8:11] <- lapply(mtcars[8:11], factor)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多