r - 使用列位置的dplyr full_join

时间:2017-12-29 03:33:00

标签: r dataframe merge dplyr

我是以下数据框:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh1 = ss.getSheetByName('Try1');  

我想加入AB和CD,其中第一列CD等于AB的第二列。请注意,我的实际数据将有不同数量的列,名称各不相同,所以我真的在寻找一种基于位置加入的方法。我一直在尝试这个:

a <- c(1,1,1)
b<- c(10,8,2)
c<- c(2,2)
d<- c(3,5)

AB<- data.frame(a,b)
CD<- data.frame(c,d)

然后我尝试这样加入:

#Get the name of the last column in AB
> colnames(AB)[ncol(AB)]
[1] "b"
#Get the name of the first column in CD
> colnames(CD)[1]
[1] "c"

我正在寻找的行为基本上是这样的:

> abcd <- full_join(AB, CD, by = c(colnames(AB)[ncol(AB)]=colnames(CD)[1]))
Error: unexpected '=' in "abcd <- full_join(AB, CD, by = c(colnames(AB)[ncol(AB)]="

2 个答案:

答案 0 :(得分:5)

我们可以setNames

full_join(AB, CD, setNames(colnames(CD)[1], colnames(AB)[ncol(AB)]))
#  a  b  d
#1 1 10 NA
#2 1  8 NA
#3 1  2  3
#4 1  2  5

答案 1 :(得分:1)

我们可以使用通用名称替换目标列名称,例如“Target”,然后执行full_join。最后,将“Target”名称替换为原始列名称。

library(dplyr)

AB_name <- names(AB)
target_name <- AB_name[ncol(AB)] # Store the original column name

AB_name[ncol(AB)] <- "Target" # Set a common name
names(AB) <- AB_name

CD_name <- names(CD)
CD_name[1] <- "Target" # Set a common name
names(CD) <- CD_name

abcd <- full_join(AB, CD, by = "Target") %>% # Merge based on the common name
  rename(!!target_name := Target) # Replace the common name with the original name
abcd
#   a  b  d
# 1 1 10 NA
# 2 1  8 NA
# 3 1  2  3
# 4 1  2  5