R中多个变量的频率计数
frequency count of multiple variables in R
我的数据框中有多个变量。我想从大 datasets.e.g
的 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)
还有其他方法可以实现吗?
您可以将 apply
与 table
一起使用
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
我们可以使用 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
通过数据集的nrow
,unlist
第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
你可以这样做:
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
))
plyr
包中计数函数的更简单实现是:
library(plyr)
var_select = c("Q1", "Q2")
count_freq = count(table, var_select)
在table函数中使用子集也得到了类似的结果:
var_select = c("Q1", "Q2")
freq_table = as.data.frame(table(subset(table, select = var_select)))
这两种方法都会创建一个包含 3 列的频率 table - Q1、Q2、Freq。
您可以轻松地向 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)))
}
我的数据框中有多个变量。我想从大 datasets.e.g
的 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)
还有其他方法可以实现吗?
您可以将 apply
与 table
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
我们可以使用 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
通过数据集的nrow
,unlist
第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
你可以这样做:
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
))
plyr
包中计数函数的更简单实现是:
library(plyr)
var_select = c("Q1", "Q2")
count_freq = count(table, var_select)
在table函数中使用子集也得到了类似的结果:
var_select = c("Q1", "Q2")
freq_table = as.data.frame(table(subset(table, select = var_select)))
这两种方法都会创建一个包含 3 列的频率 table - Q1、Q2、Freq。 您可以轻松地向 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)))
}