我需要打开这个数据框:

r - 重塑原始目的地数据-LMLPHP

df1 <- data.frame(A = c(1,2,3), B = c(2,1,4), Flow = c(50,30,20))

变成这样的数据帧:

r - 重塑原始目的地数据-LMLPHP
df2 <- data.frame(A = c(1,3), B = c(3,4), AtoB = c(50,20), BtoA = c(20, NA))

我正在尝试用dplyr重塑它。有现成的功能或方法吗?

最佳答案

一种选择是基于每行的最小值在标签“AtoB / BtoA”和“A”和“B”之间创建一个标识符列,然后通过使用min/max来更改“A”,“B”中的值每行(pmin/pmax)和spread将输出返回到“宽”格式

library(dplyr)
library(tidyr)
df1 %>%
  mutate(grpIdent = case_when(A == pmin(A, B) ~ 'AtoB', TRUE ~ 'BtoA'),
         A1= pmin(A, B), B1 = pmax(A, B)) %>%
  select(A = A1, B = B1, grpIdent, Flow) %>%
  spread(grpIdent, Flow)
#   A B AtoB BtoA
#1 1 2   50   30
#2 3 4   20   NA

10-07 12:43