Поскольку порядок объединения не имеет значения, давайте создадим столбец TreeID
, в котором мы сортируем tree1
и tree2
, чтобы пары чисел всегда приходились в одном порядке.
Это проще, если ваши данные не закодированы как factor
, потому что взятие min/max
фактора не работает, и вам нужно привести к символу, а затем к числовому, чтобы заставить его работать нормально. Если вам нужно сделать это с вашими исходными данными, as.numeric(as.character(tree.dat1$tree))
поможет. Вы можете взять максимум вектора character
без преобразования в numeric
, но я предпочитаю этого не делать, потому что max("11","2")
работает не так, как вы могли бы ожидать.
library(tidyverse)
library(stringr)
tree.dat1 = data.frame(tree1 = c(rep(33,3),rep(22,2),11),
tree2 = c(22,11,44,11,44,44),
value = c(0.02, rep(0.03,3), rep(0.01,2)))
tree.dat2 = data.frame(tree1 = c(rep(11,3),rep(33,2),22),
tree2 = c(22,33,44,22,44,44),
value1 = c(rep(3,0.05),0.02,rep(0.03,2)))
Создайте TreeID
, объединив минимальное и максимальное значения tree1
и tree2
. Мы используем rowwise()
для получения максимального и минимального значения для каждой строки, а не для каждого столбца.
tree.dat1 <- tree.dat1 %>% rowwise() %>%
mutate(TreeID= str_c(min(tree1, tree2), max(tree1,tree2)))
tree.dat2 <- tree.dat2 %>% rowwise() %>%
mutate(TreeID= str_c(min(tree1, tree2), max(tree1,tree2)))
left_join(tree.dat1, tree.dat2, by = "TreeID")
Source: local data frame [6 x 7]
Groups: <by row>
# A tibble: 6 x 7
tree1.x tree2.x value TreeID tree1.y tree2.y value1
<dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl>
1 33 22 0.02 2233 33 22 0.02
2 33 11 0.03 1133 11 33 0.03
3 33 44 0.03 3344 33 44 0.03
4 22 11 0.03 1122 11 22 0.02
5 22 44 0.01 2244 22 44 0.03
6 11 44 0.01 1144 11 44 0.03
Чтобы точно соответствовать желаемому выводу:
left_join(tree.dat1, tree.dat2, by = "TreeID") %>% select(-tree1.y, -tree2.y, -TreeID) %>%
rename(tree1 = tree1.x, tree2 = tree2.x)
tree1 tree2 value value1
<dbl> <dbl> <dbl> <dbl>
1 33 22 0.02 0.02
2 33 11 0.03 0.03
3 33 44 0.03 0.03
4 22 11 0.03 0.02
5 22 44 0.01 0.03
6 11 44 0.01 0.03