重塑起点目的地数据

Reshape origin destination data

我需要转这个数据框:

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

进入这样的数据框:

df2 <- data.frame(A = c(1,3), B = c(3,4), AtoB = c(50,20), BtoA = c(20, NA))

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

使用base R(这可能需要引入一个或多个空格)。还假定连续输入 to 和 fro- 值。

 new_df<-cbind(df[seq(1,nrow(df), by=2),], df[seq(2,nrow(df), by=2),])[,-c(4,5)]
names(new_df)<-c("A","B","AtoB","BtoA")  
new_df

结果:

# A B AtoB BtoA
#1 1 2   50   30
#3 3 4   20   30

一个选项是在 'A' 和 'B' 之间创建一个标识符列,并根据每行中的最小值使用标签 'AtoB/BtoA',然后更改 [=16] 中的值=], 'B' 通过对每一行 (pmin/pmax) 取 min/maxspread 输出回到 'wide' 格式

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