Изменить исходные данные назначения - PullRequest
2 голосов
/ 22 марта 2019

Мне нужно превратить этот фрейм данных:

enter image description here

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

в такой фрейм данных:

enter image description here

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

Я пытаюсь изменить его с помощью dplyr.Существует ли существующая функция или способ сделать это?

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Можно создать столбец идентификаторов между «A» и «B» с метками «AtoB / BtoA» на основе минимального значения в каждой строке, а затем изменить значения в «A», «B», взяв min/max для каждой строки (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
2 голосов
/ 22 марта 2019

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...