首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当不是所有的值都出现在所有列中时,如何在R中制作多变量频率表?

当不是所有的值都出现在所有列中时,如何在R中制作多变量频率表?
EN

Stack Overflow用户
提问于 2019-03-15 00:15:17
回答 1查看 372关注 0票数 1

我想用R做一个这样的频率表:

代码语言:javascript
运行
复制
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),我们将得到一个列表,而不是一个很好的数据帧。

代码语言:javascript
运行
复制
# 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)

有什么简单的方法可以做一些类似的事情来保证数据帧的输出,而不管计数是多少?

我可以想象一些看起来混乱或被黑客攻击的解决方案,例如,这会产生预期的结果:

代码语言:javascript
运行
复制
# 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)))))

有没有更干净的方法来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-15 00:24:20

我将继续回答,尽管我仍然反对缺乏标准。如果我们认为“整洁”是“凌乱”的对立面,那么我们应该首先将输入数据整理成较长的格式。然后我们就可以做双向table

代码语言:javascript
运行
复制
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版本:

代码语言:javascript
运行
复制
table(stack(df))
#       ind
# values aa bb cc
#      7  1  1  2
#      8  2  1  2
#      9  1  2  0
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55167345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档