【问题标题】:Frequency table of multiple columns多列频率表
【发布时间】:2018-04-21 14:32:32
【问题描述】:

我有一个包含 16000 行和 2800 个分类列的庞大数据集。我想制作一个矩阵,其中行=变量名和列=标签。我已经尝试过使用表格的应用功能,但我得到的是列表格式的结果。

data= sapply(mydata, table)
output
var1
1               2         3          4        5
1855    8520    1117   1700    2568
var2
-1         - 2      - 3      0       1    2
5642  2634 5218 321 745 605

【问题讨论】:

  • 所有分类变量的级别数是否相同?
  • 您能否编辑您的帖子以包含您的部分数据(使用例如dput)。
  • 也许这是不可能的,如果列的级别数不同,结果将是一个包含不同长度成员的列表。
  • 这是sapply(mydata, function(x) table(levels(x)[x]))吗?
  • 嗨 Rui 感谢您的回复...我总共有 187 个独特的级别...并且所有分类变量都没有相同的变量。我得到列表格式的结果,但我想要 2800*187 的矩阵格式的结果。

标签: r


【解决方案1】:
library(dplyr)

以鸢尾花为例。

str(iris)
   'data.frame':    150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 

下面是一个为所有列创建频率表的包装函数,记得用你的数据集替换 iris。

freq <- function (...) {
  iris %>% count(...) %>% arrange(desc(n))
}

使用 apply 将所有列发送到函数频率。

a <- apply(X = iris,MARGIN = 2,freq)

使用 for 循环在(列表对象)中修改单个数据框。

for (i in 1:length(a)) {
  a[[i]]$Column <- names(a[i])
  print(i)
  names(a[[i]]) <- c("Variable","n","Column_name")
}

使用 do.call() 绑定所有行。

final <- do.call(rbind,a) %>% data.frame() %>% select(Column_name,Variable,n)

iris 的最终结果如下。

【讨论】:

  • captureDots(strict = __quosured) 中的错误:参数已被评估
  • a[i] 中的错误:'closure' 类型的对象不是子集
  • do.call(rbind, a) 中的错误:第二个参数必须是一个列表
  • 如果您可以将代码与错误一起发布,将会很有帮助。这样我就可以看到是哪一行造成了错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2018-06-15
  • 2022-01-19
  • 2013-03-08
  • 1970-01-01
  • 2014-11-07
相关资源
最近更新 更多