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中进行澄清