【问题标题】:frequency count of multiple variables in RR中多个变量的频率计数
【发布时间】:2016-11-18 16:06:31
【问题描述】:

我的数据框中有多个变量。我想更多地从大型数据集的 QA 角度检查 一些选定变量 的单个频率计数。例如

ID Q1 Q2 Q3
1  1  2  3
2  2  1  2 
3  3  2  1
4  1  2  3
5  2  3  1

所以,我应该得到我选择的变量 Q1 和 Q2 的频率计数,作为下面的输出

Q1 1 - 2
   2 - 2
   3 - 1

Q2 1 - 1
   2 - 3
   3 - 1

我尝试了 table(),但似乎我必须多次编写此函数,这是我想避免的。

table(df$Q1)
table(df$Q2)

还有其他方法可以实现吗?

【问题讨论】:

    标签: r dplyr frequency analysis


    【解决方案1】:

    您可以将applytable 一起使用

    apply(df[-1], 2, table)
    
    #  Q1 Q2 Q3
    #1  2  1  2
    #2  2  3  1
    #3  1  1  2
    

    或者,如果您希望它仅用于您想使用您可以使用的名称指定的选定行,

    apply(df[c("Q1", "Q2")], 2, table)
    
    
    #  Q1 Q2
    #1  2  1
    #2  2  3
    #3  1  1
    

    【讨论】:

    • 这会给我数据框中所有变量的计数。我只想获取选定变量的计数(例如 Q1 和 Q2)。此外,我想使用他们的 varnames 而不是引用来调用它。实际上,我有大量变量,我正在通过重新编码原始变量来创建新变量,并希望通过获取过程中添加的新变量的频率计数来执行 QA。
    • 更新了帖子。这是你想要的吗?
    • 非常感谢罗纳克!这正是我想要的。感谢您的帮助和时间。
    • 完成!再次感谢!
    【解决方案2】:

    plyr 包中计数函数的更简单实现是:

    library(plyr) 
    var_select = c("Q1", "Q2")
    count_freq = count(table, var_select)
    

    在表函数中使用子集也可以得到类似的结果:

    var_select = c("Q1", "Q2")
    freq_table = as.data.frame(table(subset(table, select = var_select)))
    

    这两种方法都将创建一个包含 3 列的频率表 - Q1、Q2、频率。 您可以轻松地向 var_select 添加更多变量名,而无需在下一个命令中进行任何更改。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      library(plyr)
      r <- apply(df[-1],2,count)
      
      r$Q1
      
      # $Q1
        # x freq
      # 1 1    2
      # 2 2    2
      # 3 3    1
      
      r$Q2
      
      # $Q2
        # x freq
      # 1 1    1
      # 2 2    3
      # 3 3    1
      

      你也可以这样做:

      cols <- c("Q1","Q2")
      apply(df[cols],2,count)
      

      这会给你同样的结果。

      数据

      df <- structure(list(ID = 1:5, Q1 = c(1L, 2L, 3L, 1L, 2L), Q2 = c(2L, 
      1L, 2L, 2L, 3L), Q3 = c(3L, 2L, 1L, 3L, 1L)), .Names = c("ID", 
      "Q1", "Q2", "Q3"), class = "data.frame", row.names = c(NA, -5L
      ))
      

      【讨论】:

      • 这会给我数据框中所有变量的计数。我只想获取选定变量的计数(例如 Q1 和 Q2)。此外,我想使用他们的 varnames 而不是引用来调用它。
      【解决方案4】:

      我们可以使用lapply遍历第2列和第3列,得到table

      lapply(df1[paste0("Q", 1:2)], table)
      #$Q1
      
      #1 2 3 
      #2 2 1 
      
      #$Q2
      
      #1 2 3 
      #1 3 1 
      

      或者没有任何循环,replicate 数据集 2 和 3 的 names 通过数据集的nrowunlist 第 2 和第 3 列,并应用 table

      table(rep(names(df1)[names(df1) %in% c("Q1", "Q2")],nrow(df1)), 
                          unlist(df1[paste0("Q", 1:2)]))    
      #    1 2 3
      # Q1 2 2 1
      # Q2 1 3 1
      

      【讨论】:

      • 这会给我数据框中所有变量的计数。我只想获取选定变量的计数(例如 Q1 和 Q2)。此外,我想使用他们的 varnames 而不是引用来调用它。实际上,我有大量变量,我正在通过重新编码原始变量来创建新变量,并希望通过获取过程中添加的新变量的频率计数来执行 QA。
      • @databaaz 你没看到我对第 2 列和第 3 列进行了子集化。我什至不看答案都不知道谁在支持评论。这两种解决方案都给出了您显示的预期输出
      • @databaaz 更新帖子
      【解决方案5】:
      freq_tibble <- function(data, var1, var2) {
        var1 <- rlang::enquo(var1)
        var2 <- rlang::enquo(var2)
      
        data %>%
          dplyr::count(!!var1, !!var2) %>%
          tidyr::spread(!!var2, n, fill = 0) %>%
          dplyr::mutate(Total := rowSums(dplyr::select(., -!!var1))) %>%
          dplyr::bind_rows(dplyr::bind_cols(!!rlang::quo_name(var1) := "Total", dplyr::summarize_if(., is.numeric, sum)))
      }
      

      【讨论】:

        猜你喜欢
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多