在R中多个变量的频率计数

3

我在数据框中有多个变量。我想要从大数据的质量保证角度检查选定变量的个体频率计数,例如:

某些选定变量的频率计数。

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)

有没有其他方式可以实现这个?
5个回答

5
您可以使用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)的计数。此外,我想使用它们的变量名而不是引用来调用它们。实际上,我有很多变量,并且通过重新编码原始变量创建新变量,并希望通过获取在过程中添加的新变量的频率计数来执行 QA。 - databaaz
更新了帖子。这是你想要的吗? - Ronak Shah
1
非常感谢你Ronak!这正是我一直在寻找的。感谢你的帮助和为此付出的时间。 - databaaz
1
完成了!再次感谢! - databaaz
在"...2, table)"中的"2"是什么意思?为什么是个2呢? - undefined

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

或者不使用任何循环,通过将数据集2和3的names复制nrow次,unlist第二列和第三列,并应用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

1
这将为我提供数据框中所有变量的计数。我只想获取所选变量(例如Q1和Q2)的计数。此外,我希望使用它们的变量名称而不是引用来调用它。实际上,我有大量变量,并且正在通过重新编码原始变量创建新变量,并希望通过获取添加的新变量的频率计数来执行QA。 - databaaz
@databaaz 你没看到我筛选了第二和第三列吗?我不知道是谁在没有查看答案的情况下点赞评论。两个解决方案都给出了你展示的预期输出。 - akrun
@databaaz 更新了帖子。 - akrun

2
你可以做以下几件事情:

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)的计数。此外,我希望使用它们的变量名而不是引用来调用它。 - databaaz

2
一个更简单的 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中轻松添加更多变量名,而无需更改下一个命令中的任何内容。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接