组合R表函数中的列

时间:2016-05-29 08:52:27

标签: r dataframe

我目前正在学习R,我遇到了制表数据的问题。

我在数据框model中有整数分数,范围从1到10(含)。当我使用表函数时,即

table(model$score)

我得到以下结果:

  1  2  3  4  5  6  7  8  9 10
  5  6  8  7  2  3  6  4  5  0

但是,我想按以下格式制表数据:

  1-2  3-4  5-6  7-8  9-10
   11   15    5   10     5

是否可以使用表格功能实现此功能,还是必须寻求其他功能/包的帮助?那我该怎么办? prop.table函数有类似的方法吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

为什么不简单地这样做?

x <- table(model$score)
x <- x[c(1,3,5,7,9)] + x[c(2,4,6,8,10)]
names(x) <- c("1-2","3-4","5-6","7-8","9-10")

它根本不会引入额外的复杂性。

table当然会给你一个长度为10的向量,因为你有10个独特的等级。

好吧,如果你坚持要求table()获得你想要的结果,你需要使用cut()将数据分类到垃圾箱中:

set.seed(0); a <- sample(1:10, 200, replace = TRUE)
table(cut(a, breaks = c(0,2,4,6,8,10)))

 (0,2]  (2,4]  (4,6]  (6,8] (8,10] 
    29     45     43     47     36 

更改标签?使用labels(在cut()内):

table(cut(a, breaks = c(0,2,4,6,8,10), labels = c("1-2","3-4","5-6","7-8","9-10")))

 1-2  3-4  5-6  7-8 9-10 
  29   45   43   47   36 

但你必须确保a是数字。如果出现以下情况,您将收到错误:

a <- factor(a)
table(cut(a, breaks = c(0,2,4,6,8,10)))

Error in cut.default(a, breaks = c(0, 2, 4, 6, 8, 10)) : 
  'x' must be numeric

答案 1 :(得分:4)

您还可以使用zoo包,

library(zoo)
rollapply(table(model$score), 2, by = 2, sum)

使用@Zheyuan Li的例子,(根据@ G.Grothendieck的评论更新)

tt <- rollapply(table(a), 2, by = 2, sum)
names(tt) <- rollapply(names(table(a)), 2, by = 2, paste, collapse = "-")
tt
# 1-2  3-4  5-6  7-8 9-10 
#  29   45   43   47   36 

答案 2 :(得分:4)

这是RcppRolltabulate

的更快选项
library(RcppRoll)
nm1 <- do.call(paste, c(as.data.frame(matrix(1:10, ncol=2, byrow=TRUE)), list(sep="-")))
setNames(roll_sum(tabulate(a),2)[c(TRUE, FALSE)], nm1)
# 1-2  3-4  5-6  7-8 9-10 
#  29   45   43   47   36