重塑起点目的地数据
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/max
和 spread
输出回到 '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
我需要转这个数据框:
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/max
和 spread
输出回到 '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