2017-12-29 29 views
1

を用いFULL_JOIN dplyr Iは、次のデータフレーム:R - 列の位置

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) 

Iは、CDの最初の列は、ABの2列目に等しく、AB及びCDを、参加したいと思います。私の実際のデータにはさまざまな名前のカラムがありますので、私は実際にポジションのみに基づいて参加する方法を探しています。私はこれをしようとしている:

#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)]=" 

私が探しています動作は、基本的にこれです:

> abcd<- full_join(AB, CD, by = c("b" = "c")) 
> abcd 
    a b d 
1 1 10 NA 
2 1 8 NA 
3 1 2 3 
4 1 2 5 

答えて

4

我々は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

これは素晴らしいです行うことができます! 'setNames(" c "、" b ")'は 'c(" b "=" c ")'と同じです。 – www

+1

これは私の一日を作った。 –

1

我々がターゲットを置き換えることができます列名に「Target」などの共通名を付け、次にfull_joinを実行します。最後に、「ターゲット」の名前を元の列名に置き換えます。

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