R交织具有相同列名的两个数据帧

R交织具有相同列名的两个数据帧,r,data.table,R,Data.table,我有两个数据表: before表示处于“原始”状态的数据表(在任何清理操作之前) after表示经过各种清理和操作后的数据表 它们大多具有匹配的列名 是否可以构造第三个数据框,其中具有匹配名称的列彼此相邻,名称可能被修改(name.before,name.before),所有多余的列都放在末尾 例如: 数据帧之前的: data.table::data.table(a = c(1,2,3), b = c(1,2,3), c = c(1,2,3)) a b c 1: 1 1 1 2: 2

我有两个数据表:

  • before
    表示处于“原始”状态的数据表(在任何清理操作之前)
  • after
    表示经过各种清理和操作后的数据表
它们大多具有匹配的列名

是否可以构造第三个数据框,其中具有匹配名称的列彼此相邻,名称可能被修改(
name.before
name.before
),所有多余的列都放在末尾

例如:

数据帧之前的

data.table::data.table(a = c(1,2,3), b = c(1,2,3), c = c(1,2,3))

   a b c
1: 1 1 1
2: 2 2 2
3: 3 3 3
data.table::data.table(a = c("a","b","c"), c = c("a","b","c"), d = c(1,2,3))

   a c d
1: a a 1
2: b b 2
3: c c 3
数据帧后的

data.table::data.table(a = c(1,2,3), b = c(1,2,3), c = c(1,2,3))

   a b c
1: 1 1 1
2: 2 2 2
3: 3 3 3
data.table::data.table(a = c("a","b","c"), c = c("a","b","c"), d = c(1,2,3))

   a c d
1: a a 1
2: b b 2
3: c c 3
所需的输出将是:

   a.before a.after c.before c.after d
1:        1       a        1       a 1
2:        2       b        2       b 2
3:        3       c        3       c 3

这样做的目的是便于对相同的列进行比较,以验证在对数据表应用了各种函数之后,列输出是否合适。

一个选项是
cbind
并在
顺序上使用
setcolorder
ed列名串联,然后使用
make.unique
如果目的是在重复的列名上标识before/after

library(data.table)
out <- setcolorder(cbind(dt1, dt2), order(c(names(dt1), names(dt2))))[]
setnames(out, make.unique(names(out)))[]
out[, setdiff(names(dt1), names(dt2)) := NULL][]
#   a.before a.after c.before c.after d
#1:        1       a        1       a 1
#2:        2       b        2       b 2
#3:        3       c        3       c 3
base R游乐场:



更新后的列(
b
d
)最后显示未受影响的列(
b

此tidyverse方法接受data.table对象,还返回data.table对象:

library(tidyverse)

cols_to_rename <- intersect(colnames(before), colnames(after))

rename_cols <- function(data, suffix) 
  data %>% rename_with(~paste0(., suffix), all_of(cols_to_rename))

bind_cols(rename_cols(before, ".before"), rename_cols(after, ".after")) %>%
  select(starts_with(paste0(cols_to_rename, ".")), everything())

   a.before a.after c.before c.after b d
1:        1       a        1       a 1 1
2:        2       b        2       b 2 2
3:        3       c        3       c 3 3
库(tidyverse)
cols_至_重命名%
选择(以(粘贴0(cols_to_rename,“.”)开头),所有内容()
a、 在…之前在…之后在…之前在…之后
1:1A11
2:2b2b2
3:3C3C33

两者都是错误的,因为b列不在右侧。“所有多余的柱子都放在最后”@polkas谢谢,我错过了那部分。更新了解决方案根据OP的帖子,“b”不应出现在预期输出中。可能您需要使用
setdiff
,因此这两种解决方案仍然是错误的。但是我们都知道它应该在右边。可能是OP的错别字。不确定。最好从OP中进行澄清