当并非所有值都出现在所有列中时,如何在 R 中创建多变量频率 table?
How do you make a multiple variable frequency table in R when not all values are present in all columns?
我想在 R 中创建这样的频率 table:
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,9,8,7))
apply(df, 2, table)
# outputs:
# aa bb cc
# 7 1 1 2
# 8 2 1 1
# 9 1 2 1
但是,如果 df
的其中一列的计数为 0(例如,如果我们更改上面的内容以使 df$cc
没有 9
),我们将得到一个列表而不是一个漂亮的数据框。
# example that gives a list
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,8,8,7))
apply(df, 2, table)
有什么简单的方法可以做类似的事情,无论计数如何都能保证数据帧输出?
我可以想象出许多看似凌乱或被黑的解决方案,例如,这会产生所需的结果:
# example of a messy but correct solution
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,8,8,7))
apply(df, 2, function(x) summary(factor(x, levels = unique(unlist(df)))))
有更简洁的方法吗?
我会继续回答,虽然我仍然反对缺乏标准。如果我们把"tidy"想成"messy"的反义词,那么我们应该先把输入的数据整理成长格式。然后我们可以做一个双向 table
:
library(tidyr)
df %>% gather %>%
with(table(value, key))
# key
# value aa bb cc
# 7 1 1 2
# 8 2 1 2
# 9 1 2 0
感谢 Markus 提供基础 R 版本:
table(stack(df))
# ind
# values aa bb cc
# 7 1 1 2
# 8 2 1 2
# 9 1 2 0
我想在 R 中创建这样的频率 table:
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,9,8,7))
apply(df, 2, table)
# outputs:
# aa bb cc
# 7 1 1 2
# 8 2 1 1
# 9 1 2 1
但是,如果 df
的其中一列的计数为 0(例如,如果我们更改上面的内容以使 df$cc
没有 9
),我们将得到一个列表而不是一个漂亮的数据框。
# example that gives a list
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,8,8,7))
apply(df, 2, table)
有什么简单的方法可以做类似的事情,无论计数如何都能保证数据帧输出?
我可以想象出许多看似凌乱或被黑的解决方案,例如,这会产生所需的结果:
# example of a messy but correct solution
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,8,8,7))
apply(df, 2, function(x) summary(factor(x, levels = unique(unlist(df)))))
有更简洁的方法吗?
我会继续回答,虽然我仍然反对缺乏标准。如果我们把"tidy"想成"messy"的反义词,那么我们应该先把输入的数据整理成长格式。然后我们可以做一个双向 table
:
library(tidyr)
df %>% gather %>%
with(table(value, key))
# key
# value aa bb cc
# 7 1 1 2
# 8 2 1 2
# 9 1 2 0
感谢 Markus 提供基础 R 版本:
table(stack(df))
# ind
# values aa bb cc
# 7 1 1 2
# 8 2 1 2
# 9 1 2 0