У меня есть два фрейма данных в R,
дф1:
и df2:
я хочу изменить порядок фрейма данных df2, а точнее, изменить порядок столбца var2 в df2 на основе порядка столбца var1 в df1. В идеале я хочу, чтобы мой новый фрейм данных выглядел так:
Как я могу сделать это в R и возможно ли это с помощью функций dplyr?
данные :
library(tidyverse)
df1 = tibble(var1 = c("A","B","C","D"),val1 = c(2,3,4,5))%>%
mutate(var1 = as.factor(var1))
df2 = tibble(var1 = c("D","C","B","A"),val2 = c(101,103,17,99))%>%
mutate(var1 = as.factor(var1))





Может быть
df2 %>%
arrange(var1[df1$var1])
или
df2 %>%
arrange(match(var1, df1$var1))
или
df1 %>%
left_join(df2) %>%
select(-val1)
который дает
# A tibble: 4 × 2
var1 val2
<fct> <dbl>
1 A 99
2 B 17
3 C 103
4 D 101
Я сделал слияние благодаря функции merge из базового пакета:
join <- merge(df1, df2, by.x = "Var1", by.y = "Var2")
Здесь я говорю, что хочу объединить df1 и df2, используя для столбца слияния столбец Var1 в x (df1) и Var2 в y (df2).
result <- join[c(1, 3)]
Наконец, я выбираю столбцы, которые хочу сохранить.
Используя match().
> df2[order(df1$val1[match(df2$var1, df1$var1)]), ]
var1 val2
4 A 99
3 B 17
2 C 103
1 D 101
Это возможное решение с forcats близко к тому, что вы пробовали, и будет обрабатывать группы, которые существуют в df2, но не существуют в df1:
(данные об игрушке в конце)
library(tidyverse)
# `forcats` approach
new_df2 <- df2 %>%
mutate(Var1 = fct(Var1, levels = unique(c(df1$Var1, Var1)))) %>%
arrange(Var1)
Выход:
> new_df2
# A tibble: 6 × 2
Var1 Val2
<fct> <dbl>
1 A 99
2 B 17
3 C 103
4 D 101
5 E -1
6 F -10
Игрушечные данные с новыми группами в df2:
# Toy data
df1 <- tibble::tribble(
~Var1, ~Val1,
"A", 2,
"B", 3,
"C", 4,
"D", 5)
df2 <- tibble::tribble(
~Var1, ~Val2,
"E", -1, # <--
"D", 101,
"C", 103,
"B", 17,
"A", 99,
"F", -10) # <--
Created on 2024-05-19 with reprex v2.1.0
К вашему сведению:
merge— это базовая функция. Эквивалентdplyr— это набор функций соединения, здесь хорошо подойдутinner_joinилиleft_join.