首页 > 解决方案 > 统计类别内重复测量期间类别变量的变化次数

问题描述

我正在处理一个关于全国迁移的数据集,其中包含以下列:

i   birth   gender  race    region  urban   wage    year  educ
1   58      2        3      1       1       4620    1979   12
1   58      2        3      1       1       4620    1980   12
1   58      2        3      2       1       4620    1981   12
1   58      2        3      2       1       4700    1982   12

......

i   birth   gender  race    region  urban   wage    year  educ
45   65      2        3      3       1      NA       1979   10
45   65      2        3      3       1      NA       1980   10
45   65      2        3      4       2      11500    1981   10
45   65      2        3      1       1      11500    1982   10

i = 个人身份。他们跟踪一大群人 25 年,记录“区域”(分类变量,1-4)、“城市”(虚拟)、“工资”和“教育”的变化。

我如何计算每个受试者在观察期间(25 年期间)内“区域”或“城市”发生变化的总次数(例如:从区域 1 到区域 3 或从城市 0 到 1)?我的数据中也有一些 NA(应该忽略)

预期输出的简化版本:

i  changes in region
1   1
...
45  2

i  changes in urban
1   0
...
45  2

然后,我想总结一下区域和城市的变化数量。

我遇到了这些答案:Count number of changes in categorical variables during repeat measurement and identify change in categorical data across datapoints in R但我仍然不明白。

这是 i=4 的部分数据。

i   birth gender    race    region  urban   wage    year    educ
4   62      2        3        1      1       NA     1979    9
4   62      2        3        NA     NA      NA     1980    9
4   62      2        3        4      1       0      1981    9
4   62      2        3        4      1       1086   1982    9
4   62      2        3        1      1       70     1983    9
4   62      2        3        1      1       0      1984    9
4   62      2        3        1      1       0      1985    9
4   62      2        3        1      1       7000   1986    9
4   62      2        3        1      1      17500   1987    9
4   62      2        3        1      1      21320   1988    9
4   62      2        3        1      1      21760   1989    9
4   62      2        3        1      1         0    1990    9
4   62      2        3        1      1         0    1991    9
4   62      2        3        1      1      30500   1992    9
4   62      2        3        1      1      33000   1993    9
4   62      2        3       NA     NA        NA    1994    9
4   62      2        3        4      1      35000   1996    9

在这里,输出应该是:

i change_reg   change_urban
4  3            0

标签: rcount

解决方案


这是我希望能让你更接近你需要的东西。

首先你分组i。然后,您可以创建一个列,该列将为区域中的每个更改指示一个 1。这会将区域的当前值与之前的值进行比较(使用lag)。请注意,如果先前的值是NA(在查看给定的第一个值时i),它将被视为没有变化。

城市也采用同样的方法。然后,汇总每个i. 我保留了这些临时变量,因此您可以检查是否获得了所需的结果。

编辑:如果您希望删除具有NAfor 的行,region或者urban您可以drop_na先添加。

library(dplyr)
library(tidyr)

df_tot <- df %>%
  drop_na(region, urban) %>%
  group_by(i) %>%
  mutate(reg_change = ifelse(region == lag(region) | is.na(lag(region)), 0, 1),
         urban_change = ifelse(urban == lag(urban) | is.na(lag(urban)), 0, 1)) %>%
  summarize(tot_region = sum(reg_change),
            tot_urban = sum(urban_change))

# A tibble: 3 x 3
      i tot_region tot_urban
  <int>      <dbl>     <dbl>
1     1          1         0
2     4          3         0
3    45          2         2

编辑tot_region:之后,要获得和列的总计tot_urban,您可以使用colSums. df_tot(如上所述存储您之前的结果。)

colSums(df_tot[-1])

tot_region  tot_urban 
         6          2 

推荐阅读