【问题标题】:How to multiply the analyzes according to the modalities of a third variable?如何根据第三个变量的模式将分析相乘?
【发布时间】:2020-01-21 12:07:00
【问题描述】:

我正在研究一个大型数据库,我想在其中根据第三个(也是第四个)变量的模式制作链表(x),并汇总结果。有点卡住了,不知道怎么弄。

这是我的数据框(数据)的结构:

age   dead     work    sex
56       1       44      M
20       0       20      F
71       0       62      F
26       1       A0      M
44       0       80      F
19       0       01      M
77       0       78      M
51       0       13      F
56       1       Z0      F

每一行都是一个个体。他有一个年龄,他是死是活,它有一个职业(这是栏目,包含职业代码:“02”是科学,“88”是冶金工人,“A0”是军事等)和性别(男/女)。

我只是想创建死亡率表。这很容易:

table(data$age, data$dead)

这是完整数据库的结果,例如:

 age  dead=0  dead=1
  ..    ....       .
  25    1725       0
  26    3627       1
  27     336       0
  28    3339       1
  30  275648     856
  31   90932     258
  32  120743     268
  33  587954    1023
  36  148610      57
  39    5101       7
  40   15960      43
  41  102273     336
  42  147941     174
  43   69216      43
  44   43178      37
  45    3074       0
  47    1424       1
  48    3471       1
  49   12048       3
  50      85       0
  51   45138     110
  52   84804     147
  53    4614      16
  54   19241      46
  55   86021     160
  ..    ....       .

现在,我想对变量“work”的每个类别执行此操作。手动,在特定类别上很容易,例如科学:

table(data$age[data$class=="02"],data$dead[data$class=="02"])

我正在搜索如何自动执行此操作:

1) 用于工作变量的每个类别。变量不连续(..., 11, 12, 13, 14, 19, 20,...),有时还有字母(A0, Z0);

2) 对于每个类别,我想区分男性和女性(科学男性的表格和科学女性的表格);

3)然后将多个表(数据)的结果聚合在一个数据框中,其中连接是年龄。因此,每一列都是按年龄、特定性别和职业划分的人数。

你能帮帮我吗?

非常感谢!

【问题讨论】:

  • 如果您在代码中提供示例 data.frame 会更容易,例如data.frame(age=c(56,20,...), dead=c(1,0,...), ...

标签: r automation aggregate


【解决方案1】:

table() 函数可以创建任意级别的列联表。您可以传递整个数据框,然后展平和重塑(假设我理解正确)。

library(tidyr)

table(df) %>%
  as.data.frame() %>%
  pivot_wider(names_from = age, values_from = Freq)

# A tibble: 36 x 11
   dead  work  sex    `19`  `20`  `26`  `44`  `51`  `56`  `71`  `77`
   <fct> <fct> <fct> <int> <int> <int> <int> <int> <int> <int> <int>
 1 0     01    F         0     0     0     0     0     0     0     0
 2 1     01    F         0     0     0     0     0     0     0     0
 3 0     13    F         0     0     0     0     1     0     0     0
 4 1     13    F         0     0     0     0     0     0     0     0
 5 0     20    F         0     1     0     0     0     0     0     0
 6 1     20    F         0     0     0     0     0     0     0     0
 7 0     44    F         0     0     0     0     0     0     0     0
 8 1     44    F         0     0     0     0     0     0     0     0
 9 0     62    F         0     0     0     0     0     0     1     0
10 1     62    F         0     0     0     0     0     0     0     0
# ... with 26 more rows

从那里您可以根据需要进一步拆分、重塑或过滤。

数据:

df <- structure(list(age = c(56L, 20L, 71L, 26L, 44L, 19L, 77L, 51L, 
56L), dead = c(1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L), work = structure(c(4L, 
3L, 5L, 8L, 7L, 1L, 6L, 2L, 9L), .Label = c("01", "13", "20", 
"44", "62", "78", "80", "A0", "Z0"), class = "factor"), sex = structure(c(2L, 
1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L), .Label = c("F", "M"), class = "factor")), class = "data.frame", row.names = c(NA, 
-9L))

【讨论】:

  • 谢谢你,但我真的不明白代码。如果我在表(数据)上使用您的代码,我有一个错误:表中的错误(megapop):尝试使用 >= 2^31 个元素制作一个表。所以我做了一张只有 3 个维度的表格:年龄、死亡、工作。在这种情况下: .f(.x[[i]], ...) 中的错误:对象'年龄' introuvable。所以我提到了 data$age 而不是年龄,我有一个错误: inds_combine(.vars, ind_list) 中的错误:位置必须在 0 和 n 之间。抱歉,我不是 R 中最好的:p Freq 是什么? DescTools 包的功能?
  • 好的,我明白了:'as.data.frame' 名称“age”为“Var1”。在使用“pivot_wider”之前,我必须重命名它。
猜你喜欢
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2021-03-13
  • 2013-09-19
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多