gpt4 book ai didi

R 交错具有相同列名的两个数据框

转载 作者:行者123 更新时间:2023-12-02 02:38:27 24 4
gpt4 key购买 nike

我有两个数据表:

  • before 表示处于“原始”状态的数据表(在任何清理操作之前)。
  • after表示经过各种清理和操作后的数据表。

它们的列名大多匹配。

是否可以构造第三个数据框,其中具有匹配名称的列彼此相邻放置并且名称可能被修改(name.beforename.after )并且所有多余的列都放在最后?

例如:

数据框之前:

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

这样做的目的是为了轻松比较相同的列,以验证在将各种函数应用于 data.table 后列输出是否合适。

最佳答案

一个选项是cbind并在ordered列名称上使用setcolorder连接,然后使用make.unique 如果目的是识别重复列名的之前/之后

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

如果我们需要专门使用before/after

out <- setcolorder(cbind(dt1, dt2), order(c(names(dt1), names(dt2))))[]    
out[, setdiff(names(dt1), names(dt2)) := NULL][]
i1 <- duplicated(names(out), fromLast = TRUE)
i2 <- duplicated(names(out))
names(out)[i1] <- paste0(names(out)[i1], ".before")
names(out)[i2] <- paste0(names(out)[i2], ".after")

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

关于R 交错具有相同列名的两个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63983568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com