计算 data.frame/tibble 中的成对变量差异

D. *_*der 3 r plyr tidyr

我有以下数据框,由在两个不同时间(t1 和 t2)测量的不同变量(A、X、L)组成。当然,在真实的数据中还有更多的变量(只是为了举例)

\n
n <- 100\n\ndf <- data.frame(A_t1 = runif(n, min = 1, max = 5),\n                 A_t2 = runif(n, min = 1, max = 5),\n                 X_t1 = runif(n, min = 1, max = 5),\n                 X_t2 = runif(n, min = 1, max = 5),\n                 L_t1 = runif(n, min = 1, max = 5),\n                 L_t2 = runif(n, min = 1, max = 5)\n) %>% pivot_longer(cols = starts_with(c("A", "X", "L")))\n\n> df\n# A tibble: 600 \xc3\x97 2\n   name  value\n   <chr> <dbl>\n 1 A_t1   4.15\n 2 A_t2   2.20\n 3 X_t1   4.49\n 4 X_t2   3.84\n 5 L_t1   1.94\n 6 L_t2   1.75\n 7 A_t1   3.16\n 8 A_t2   1.71\n 9 X_t1   2.20\n10 X_t2   4.47\n
Run Code Online (Sandbox Code Playgroud)\n

计算每个变量 t2 和 t1 之间的差异(A_delta、X_delta、L_delta)的最简单方法是什么?(可以是长格式,也可以是宽格式,但不是绝对的区别)。我一直在考虑使用group_by()and then lag(),但这似乎不是一个非常优雅的解决方案。

\n

感谢帮助!

\n

Tar*_*Jae 5

这是一种无需旋转的方法:

\n
library(dplyr)\nlibrary(stringr)\ndf %>%\n  mutate(across(ends_with('_t2'), ~ . -\n                  get(str_replace(cur_column(), "t2$", "t1")), .names = "diff_{.col}")) %>%\n  rename_at(vars(starts_with('diff')), ~ str_remove(., "\\\\_t2"))\n\n
Run Code Online (Sandbox Code Playgroud)\n
    A_t1  A_t2  X_t1  X_t2  L_t1  L_t2 diff_A diff_X  diff_L\n   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>   <dbl>\n 1  1.87  3.07  2.81  2.00  4.25  2.92  1.20  -0.809 -1.33  \n 2  1.67  3.33  4.93  4.70  1.59  3.06  1.66  -0.225  1.47  \n 3  2.51  2.85  2.88  1.12  4.27  2.63  0.338 -1.75  -1.64  \n 4  2.92  3.48  3.04  2.85  2.14  3.66  0.565 -0.189  1.53  \n 5  1.58  4.76  3.82  2.55  3.52  3.63  3.18  -1.27   0.104 \n 6  3.49  3.95  3.58  4.32  1.65  3.67  0.458  0.738  2.02  \n 7  1.10  2.67  3.91  4.96  3.08  2.08  1.57   1.06  -0.999 \n 8  3.58  1.33  1.55  2.25  4.38  4.47 -2.26   0.704  0.0950\n 9  3.05  4.37  3.39  1.71  2.98  4.69  1.32  -1.68   1.71  \n10  1.17  3.83  4.92  2.15  1.74  4.00  2.67  -2.77   2.26  \n# \xe2\x80\xa6 with 90 more rows\n# \xe2\x84\xb9 Use `print(n = ...)` to see more rows\n
Run Code Online (Sandbox Code Playgroud)\n