我有以下数据框,由在两个不同时间(t1 和 t2)测量的不同变量(A、X、L)组成。当然,在真实的数据中还有更多的变量(只是为了举例)
\nn <- 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\nRun Code Online (Sandbox Code Playgroud)\n计算每个变量 t2 和 t1 之间的差异(A_delta、X_delta、L_delta)的最简单方法是什么?(可以是长格式,也可以是宽格式,但不是绝对的区别)。我一直在考虑使用group_by()and then lag(),但这似乎不是一个非常优雅的解决方案。
感谢帮助!
\n这是一种无需旋转的方法:
\nlibrary(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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n