freq()在打印期间重命名列

时间:2016-12-22 16:48:32

标签: r plyr

我想为我的数据框中的每一列获取一个单向频率表(每列中每个唯一值的计数)。我关注this tutorial,建议使用plyr包中的count()函数。

for (col in mtcars[c("gear","carb")]){
 freq <- count(col)
 write.table(freq, file='filename.txt')
}

我希望输出看起来像这样:

  gear  freq
1 3     15
2 4     12
3 5     5

而是将列名替换为“x”:

  x freq
1 3   15
2 4   12
3 5    5

为什么会发生这种情况,如何修改for循环以便打印列名而不是'x'?

(除了使用for循环之外,还有一种更好的矢量化方法可以做到这一点,但我是R的新手,并且无法弄清楚语法。)

2 个答案:

答案 0 :(得分:2)

for循环中:

for (col in c("gear","carb")){
  print(plyr::count(mtcars, col))
}

使用lapply()

lapply(c("gear","carb"), function(col) plyr::count(mtcars, col))

要明确,count不会重命名任何内容。在你的循环中,它接收col这是一个向量。向量没有列名,因此count不知道它应该使用什么名称。它使用x作为占位符。

答案 1 :(得分:1)

这也可以(数据集mtcar的列名作为输入,结果作为数据帧列表):

lapply(c("gear","carb"), function(x){df <- as.data.frame(table(mtcars[x])); names(df) <- c(x, 'freq'); df})

[[1]]
  gear freq
1    3   15
2    4   12
3    5    5

[[2]]
  carb freq
1    1    7
2    2   10
3    3    3
4    4   10
5    6    1
6    8    1