2014-11-17 153 views
1

形勢的R - 共同找到列具有相同名稱合併後

我有兩個數據幀,df1df2用相同的列標題

x <- c(1,2,3) 
y <- c(3,2,1) 
z <- c(3,2,1) 
names <- c("id","val1","val2") 

df1 <- data.frame(x, y, z) 
names(df1) <- names 

a <- c(1, 2, 3) 
b <- c(1, 2, 3) 
c <- c(3, 2, 1) 

df2 <- data.frame(a, b, c) 
names(df2) <- names 

和AM執行合併

#library(dplyr) # not needed for merge 
joined_df <- merge(x=df1, y=df2, c("id"),all=TRUE) 

這給我joined_df中的列爲id, val1.x, val2.x, val1.y, val2.y

問題

有沒有辦法共同找到了在原始數據幀相同的標題,給所加入的數據幀id, val1.x, val1.y, val2.x, val2.y列順序列?

請注意,在我的實際數據框中,我有115列,所以如果可能的話,我想避免使用joned_df <- joined_df[, c(1, 2, 4, 3, 5)]

更新/編輯:另外,我想維護列標題的原始順序,所以按字母順序排序不是一個選項(在我的實際數據中,我意識到它可以與我給出的示例一起使用)。

我期望的輸出是

id val1.x val1.y val2.x val2.y 
1 1  3  1  3  3 
2 2  2  2  2  2 
3 3  1  3  1  1 

更新與解決方案,一般情況下

接受的答案解決了我的問題很好。 我在這裏稍微修改了代碼以使用原始列名稱,而不必在rep函數中對它們進行硬編碼。

#specify columns used in merge 
merge_cols <- c("id") 

# identify duplicate columns and remove those used in the 'merge' 
dup_cols <- names(df1) 
dup_cols <- dup_cols [! dup_cols %in% merge_cols] 

# replicate each duplicate column name and append an 'x' and 'y' 
dup_cols <- rep(dup_cols, each=2) 
var <- c("x", "y") 
newnames <- paste(dup_cols, ".", var, sep = "") 

#create new column names and sort the joined df by those names 
newnames <- c(merge_cols, newnames) 
joined_df <- joined_df[newnames] 
+0

的數據幀'dplyr'負載是多餘的。 'merge'函數在'base'中。可以使用'joined_df [c('id','val1.x','val2.x','val1.y','val2.y')]' –

+0

,我用它來做其他事情,並且意外地複製它。 – tospig

回答

1

如何像這樣

numrep <- rep(1:2, each = 2) 
numrep 

var <- c("x", "y") 
var 

newnames <- paste("val", numrep, ".", var, sep = "") 

newdf <- cbind(joined_df$id, joined_df[newnames]) 
names(newdf)[1] <- "id" 

這應該給你喜歡這個

id val1.x val1.y val2.x val2.y 
1 1  3  1  3  3 
2 2  2  2  2  2 
3 3  1  3  1  1 
+0

就是這樣。謝謝。 – tospig

相關問題