按R中的范围和计数数字元素进行分组

时间:2018-03-01 05:16:05

标签: r

我是R语言的新手。可以任何人提供一些例子 我如何将两个栏目即年龄和学生数量汇总成行和列的范围,这些列可以计算每个范围内每个学生的数量。

enter image description here

预期枢轴
enter image description here

1 个答案:

答案 0 :(得分:1)

您需要使用cut和一些制表功能。首先,一些示例数据(将来,请在您的问题中提供一些数据,以及可用的数据,而不是它的图像,因为如果我可以避免,我通常不想转录数字)

set.seed(2)
n <- 100
x <- data.frame(age = sample(4:8, size=n, replace=TRUE),
                size = sample(3:14, size=n, replace=TRUE))
head(x,n=10)
#    age size
# 1    4    5
# 2    7    8
# 3    6   14
# 4    4   12
# 5    8    6
# 6    8   10
# 7    4   13
# 8    8    8
# 9    6    4
# 10   6    4

现在使用cut,根据已分配的&#34;中断值&#34;:

agebins <- c(3,5,7,9)
sizebins <- c(3,6,9,12,15)
cut(head(x$age), agebins)
# [1] (3,5] (5,7] (5,7] (3,5] (7,9] (7,9]
# Levels: (3,5] (5,7] (7,9]
cut(head(x$size), sizebins)
# [1] (3,6]   (6,9]   (12,15] (9,12]  (3,6]   (9,12] 
# Levels: (3,6] (6,9] (9,12] (12,15]

默认情况下,它会生成factor,但您可以选择(如果您不需要(5,7]的视觉效果,表明&#34;大于5,小于或等于7&#34;。)

好的,让我们将这些垃圾箱捕获到data.frame中并制成表格。

x$agebin <- cut(x$age, agebins, right = FALSE)
x$sizebin <- cut(x$size, sizebins, right=FALSE)
head(x)
#   age size agebin sizebin
# 1   4    5  [3,5)   [3,6)
# 2   7    8  [7,9)   [6,9)
# 3   6   14  [5,7) [12,15)
# 4   4   12  [3,5) [12,15)
# 5   8    6  [7,9)   [6,9)
# 6   8   10  [7,9)  [9,12)

有两个基本功能列表,tablextabs

table(x$agebin, x$sizebin)
#        
#         [3,6) [6,9) [9,12) [12,15)
#   [3,5)     6     7      5       6
#   [5,7)    13     7      6      12
#   [7,9)    11    10      7      10
with(x, table(agebin, sizebin))
#        sizebin
# agebin  [3,6) [6,9) [9,12) [12,15)
#   [3,5)     6     7      5       6
#   [5,7)    13     7      6      12
#   [7,9)    11    10      7      10

我使用了with(x, ...)符号,这样可以保留轴名称。不过我更喜欢第二个功能:

xtabs(~ agebin + sizebin, data=x)
#        sizebin
# agebin  [3,6) [6,9) [9,12) [12,15)
#   [3,5)     6     7      5       6
#   [5,7)    13     7      6      12
#   [7,9)    11    10      7      10

如果你想要边际总和,那也不难:

xtb <- xtabs(~ agebin + sizebin, data=x)
xtb <- cbind(xtb, RowTotal = rowSums(xtb))
xtb <- rbind(xtb, ColTotal = colSums(xtb))
xtb
#          [3,6) [6,9) [9,12) [12,15) RowTotal
# [3,5)        6     7      5       6       24
# [5,7)       13     7      6      12       38
# [7,9)       11    10      7      10       38
# ColTotal    30    24     18      28      100