R - 在合并后共同定位具有相同名称的列

时间:2014-11-17 00:24:42

标签: r merge

场合

我有两个数据框,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

我正在进行合并

#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]

1 个答案:

答案 0 :(得分: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