【问题标题】:Combining columns of a table based on age range根据年龄范围组合表的列
【发布时间】:2015-05-28 10:38:42
【问题描述】:

我在 R 中有一个表格,看起来像(下面只是一个示例):

|       | 15 | 17 | 18 | 22 | 25 | 26 | 27 | 29 | 
|-------|----|----|----|----|----|----|----|----|
| 10000 | 1  | 2  | 1  | 2  | 4  | 3  | 5  | 2  |
| 20000 | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  |
| 30000 | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  |
| 40000 | 0  | 0  | 0  | 1  | 2  | 3  | 6  | 3  |
| 50000 | 0  | 0  | 0  | 0  | 0  | 0  | 1  | 1  |
| 60000 | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  |

行是收入水平,列是年龄水平。我实际上是在创建这张表,通过卡方检验来查看年龄是否与收入相关。表中的数字是出现次数,例如我的数据集中有 2 个 17 岁的人,收入为 10000。

R中“num”类型的年龄和收入水平都是连续的。

我想基本上合并年龄列,以便我得到一个包含收入为 10k 且年龄在 15-25 岁、25-35 岁等之间的每个人的表格,所以我最终得到的列要少得多。

还要注意 colnames(tbl) = "15","17", "18", not "Age" - 我没有为我的列和行定义一个总体名称。

我注意到this answer 做了类似的事情,但不确定如何应用它,因为我的列没有名称,例如“mpg”(在链接的情况下)。

有什么想法吗?

【问题讨论】:

  • 我认为您可以将宽格式转换为长格式(如果是表格对象,可能通过as.data.frame 或如果是矩阵,则可能通过melt)并使用cut 创建分组列基于长格式的列,获取基于此的计数,然后使用来自reshape2dcast 将其重新整形为宽格式。顺便说一句,你有table 对象还是matrix
  • 我有一个table 对象作为str(tbl) 的输出是:“'table' int [1:7, 1:42]”等。
  • 无论如何,您在下面发布了一个解决方案,我认为它应该可以工作。如果不转成mat <- as.matrix(tbl)再试一下。

标签: r aggregate summarization cbind group-summaries


【解决方案1】:

在这里制作了我自己的矩阵,但也应该适用于 df。

mat <- matrix(sample(1:10,8500,replace = TRUE),ncol=85)
colnames(mat) <- 15:99
levs <- cut(as.numeric(colnames(mat)),seq(15,105,10),right = FALSE)
res <- sapply(as.character(unique(levs)),function(x)rowSums(mat[,levs==x]))

编辑: 如果您想要与 mat 中相同的列名,但根据类别计数,另外:

res <- res[,levs] # expands the res df to one category count col pr. original col in mat.
colnames(res) <- colnames(mat) # renames cols to reflect input matrix mat.

【讨论】:

  • 感谢@Nightwriter。但是,这不是假设我的列名是从 15:(85-1) 开始排序的吗?在我的情况下,列根据原始表中的任何内容随机步进,例如15、17、18、19、22、26 等 - 我需要保留与原始表中完全相同的列名(对应于年龄)。
  • 第二行只是将数字与列相关联。它可能是随机顺序的任何整数,适合您的问题。您需要确保第三行反映您想要的间隔。看看?cut()。这里的间隔从 15 开始,在 105 结束,长度为 10。参数right=FALSE 确保25 属于区间[25,35) 而不是[15,25)。第四行总结了每个区间 pr 的 cols。行,不管它们在矩阵中的位置。
  • 进行编辑以输出保留的列名称,但使用类别总和值而不是输入值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2021-10-22
  • 2015-04-14
相关资源
最近更新 更多