以与其他列相关联为条件获取列的差异(在 R 中)
Take differences of columns conditional on being associated to others (in R)
id hire_month sep_month wage_jan wage_feb wage_mar wage_apr
1 1 2 3 740 780 780 780
2 1 4 0 890 890 890 890
3 2 3 5 550 550 550 550
4 2 5 10 890 250 250 400
wage_may wage_jun wage_jul wage_aug wage_sep wage_oct wage_nov
1 780 780 780 780 780 780 780
2 890 890 890 890 890 790 250
3 550 550 550 550 550 550 550
4 500 890 600 750 890 300 300
wage_dec
1 780
2 300
3 550
4 300
structure(list(id = c(1L, 1L, 2L, 2L), hire_month = c(2L, 4L,
3L, 5L), sep_month = c(3L, 0L, 5L, 10L), wage_jan = c(740L, 890L,
550L, 890L), wage_feb = c(780L, 890L, 550L, 250L), wage_mar = c(780L,
890L, 550L, 250L), wage_apr = c(780L, 890L, 550L, 400L), wage_may = c(780L,
890L, 550L, 500L), wage_jun = c(780L, 890L, 550L, 890L), wage_jul = c(780L,
890L, 550L, 600L), wage_aug = c(780L, 890L, 550L, 750L), wage_sep = c(780L,
890L, 550L, 890L), wage_oct = c(780L, 790L, 550L, 300L), wage_nov = c(780L,
250L, 550L, 300L), wage_dec = c(780L, 300L, 550L, 300L)), class = "data.frame", row.names = c(NA,
-4L))
我想计算基于 hire_month 和滞后 (sep_month) 的工资之间的差异 -- 前一行和相同 ID 的分离月份。
例如,如果 lag(sep_month) 是 4(四月)而 hire_month 是 7(七月),我想计算 wage_jul 和 wage_apr 之间的差异(wage_apr 是前一行的那个)。所以我需要取差的工资实际上是在不同的行中,因为我数据集中的每一行都是一份合同。
我有一个大数据集,所以我想要一种自动执行此关联的方法。
已更新
OP 澄清了 sep month 值来自上面的行,这意味着每个 ID 有 n-1 行,其中 n 是该 ID 的行数。在上面的示例中,每个 ID 有两行,我们将仅为每个 ID
估计第二行(也是最后一行)的差异
data$diff = as_tibble(data) %>%
mutate(sep_wage = apply(.,1,function(x) x[x[3]+3])) %>%
group_by(id) %>%
mutate(sep_wage = lag(sep_wage)) %>% ungroup() %>%
apply(.,MARGIN = 1, function(x) x[x[2]+3] - x[16])
输出
id hire_month sep_month wage_jan wage_feb wage_mar wage_apr wage_may wage_jun wage_jul wage_aug wage_sep wage_oct wage_nov wage_dec diff
1 1 2 3 740 780 780 780 780 780 780 780 780 780 780 780 NA
2 1 4 0 890 890 890 890 890 890 890 890 890 790 250 300 110
3 2 3 5 550 550 550 550 550 550 550 550 550 550 550 550 NA
4 2 5 10 890 250 250 400 500 890 600 750 890 300 300 300 -50
id hire_month sep_month wage_jan wage_feb wage_mar wage_apr
1 1 2 3 740 780 780 780
2 1 4 0 890 890 890 890
3 2 3 5 550 550 550 550
4 2 5 10 890 250 250 400
wage_may wage_jun wage_jul wage_aug wage_sep wage_oct wage_nov
1 780 780 780 780 780 780 780
2 890 890 890 890 890 790 250
3 550 550 550 550 550 550 550
4 500 890 600 750 890 300 300
wage_dec
1 780
2 300
3 550
4 300
structure(list(id = c(1L, 1L, 2L, 2L), hire_month = c(2L, 4L,
3L, 5L), sep_month = c(3L, 0L, 5L, 10L), wage_jan = c(740L, 890L,
550L, 890L), wage_feb = c(780L, 890L, 550L, 250L), wage_mar = c(780L,
890L, 550L, 250L), wage_apr = c(780L, 890L, 550L, 400L), wage_may = c(780L,
890L, 550L, 500L), wage_jun = c(780L, 890L, 550L, 890L), wage_jul = c(780L,
890L, 550L, 600L), wage_aug = c(780L, 890L, 550L, 750L), wage_sep = c(780L,
890L, 550L, 890L), wage_oct = c(780L, 790L, 550L, 300L), wage_nov = c(780L,
250L, 550L, 300L), wage_dec = c(780L, 300L, 550L, 300L)), class = "data.frame", row.names = c(NA,
-4L))
我想计算基于 hire_month 和滞后 (sep_month) 的工资之间的差异 -- 前一行和相同 ID 的分离月份。 例如,如果 lag(sep_month) 是 4(四月)而 hire_month 是 7(七月),我想计算 wage_jul 和 wage_apr 之间的差异(wage_apr 是前一行的那个)。所以我需要取差的工资实际上是在不同的行中,因为我数据集中的每一行都是一份合同。
我有一个大数据集,所以我想要一种自动执行此关联的方法。
已更新
OP 澄清了 sep month 值来自上面的行,这意味着每个 ID 有 n-1 行,其中 n 是该 ID 的行数。在上面的示例中,每个 ID 有两行,我们将仅为每个 ID
估计第二行(也是最后一行)的差异data$diff = as_tibble(data) %>%
mutate(sep_wage = apply(.,1,function(x) x[x[3]+3])) %>%
group_by(id) %>%
mutate(sep_wage = lag(sep_wage)) %>% ungroup() %>%
apply(.,MARGIN = 1, function(x) x[x[2]+3] - x[16])
输出
id hire_month sep_month wage_jan wage_feb wage_mar wage_apr wage_may wage_jun wage_jul wage_aug wage_sep wage_oct wage_nov wage_dec diff
1 1 2 3 740 780 780 780 780 780 780 780 780 780 780 780 NA
2 1 4 0 890 890 890 890 890 890 890 890 890 790 250 300 110
3 2 3 5 550 550 550 550 550 550 550 550 550 550 550 550 NA
4 2 5 10 890 250 250 400 500 890 600 750 890 300 300 300 -50