首页 > 解决方案 > 使用交替的“非连接重复变量”而不是 .x,.x,.x,.y,.y,.y 格式和相应的计算来进行 full_join 的方法

问题描述

library(dplyr)
x1 <- tibble(ID = rep(1,4),
             Measure = c("Height","Weight","Width","Length"),
             AD1= rpois(4,10),
             AD2= rpois(4,9))
x2 <- tibble(ID = rep(2,4),
             Measure = c("Height","Weight","Width","Length"),
             AD1= rpois(4,20),
             AD2= rpois(4,19))

xdiff <- x1 %>%
  full_join(x2,by="Measure",
            suffix=c("_1","_2")) %>%
  mutate(diff1 = AD1_1-AD1_2,
         diff2 = AD2_1-AD2_2)

   ID_1 Measure AD1_1 AD2_1  ID_2 AD1_2 AD2_2 diff1 diff2
  <dbl> <chr>   <int> <int> <dbl> <int> <int> <int> <int>
1     1 Height     10    12     2    20    15   -10    -3
2     1 Weight      7    10     2    11    16    -4    -6
3     1 Width      12    11     2    22    17   -10    -6
4     1 Length     11     9     2    24    16   -13    -7

xdesire <- xdiff %>%
  select(Measure,AD1_1,AD1_2,diff1,AD2_1,AD2_2,diff2)

  Measure AD1_1 AD1_2 diff1 AD2_1 AD2_2 diff2
  <chr>   <int> <int> <int> <int> <int> <int>
1 Height     10    20   -10    12    15    -3
2 Weight      7    11    -4    10    16    -6
3 Width      12    22   -10    11    17    -6
4 Length     11    24   -13     9    16    -7

full_join() 使用默认参数,将按照 x、x、x、y、y、y 的顺序为重复变量添加后缀。从技术上讲,我可以根据需要使用 select() 对列进行排序,但是如果数据具有大量列,例如 AD1:AD200,则效率将非常低。

dply: 在 R 中按字母顺序排列列显示按字母顺序排列列的方法,但在我的情况下,每个变量(AD1、diff1、AD2、diff)之间都需要“差异”列。

我想知道 full_join() 是否允许重复变量交替出现,以及我是否可以通过 join() 函数直接添加计算。

当然,也欢迎其他方法,例如更高级的 select() 参数。

标签: rjoindplyr

解决方案


一个选项是使用列名order提取的第一个数字子字符串parse_number

library(dplyr)
xdiff %>%
  select(Measure, order(readr::parse_number(names(.))),  -starts_with("ID"))

-输出

# A tibble: 4 x 7
#  Measure AD1_1 AD1_2 diff1 AD2_1 AD2_2 diff2
#  <chr>   <int> <int> <int> <int> <int> <int>
#1 Height     10    25   -15     5    20   -15
#2 Weight     16    28   -12    13    15    -2
#3 Width      12    19    -7     9    25   -16
#4 Length     10    29   -19     4    23   -19

推荐阅读