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重塑它。有现成的功能或方法吗?
最佳答案
一种选择是基于每行的最小值在标签“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