R 中多个变量的频率计数



我的数据帧中有多个变量。我想从大型数据集的 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)

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

您可以将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

你可以做:

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
))

我们可以使用 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 

或者没有任何循环,nrow数据集的replicate数据集 2 和 3 的namesunlist第 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

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

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添加更多变量名称,而无需在下一个命令中更改任何内容。

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)))
}

相关内容

  • 没有找到相关文章

最新更新