场合
我有两个数据框,df1
和df2
具有相同的列标题
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]
答案 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