如何列绑定 2 个表但删除同一列

How to column bind 2 tables but remove the same column

我想加入 2 Table 具有相同的列,但只有 1 个不同的列,并将相同的列显示为一个单独的列。

如果:

dt1 <- 列名 (a,b,c,d,e)

a b c d e

1 2 3 4 5

1 2 3 4 5

1 2 3 4 5

dt2 <- 具有列名 (a,b,c,d,f)

a b c d f

1 2 3 4 6

1 2 3 4 6

1 2 3 4 6

dt3 <- cbind(dt1, dt2)

我只想做一些简单的table使用cbind

结合R

产量:

dt3 <- 有列名(a,b,c,d,e,a,b,c,d,f)

a b c d e a b c d f

1 2 3 4 5 1 2 3 4 6

1 2 3 4 5 1 2 3 4 6

1 2 3 4 5 1 2 3 4 6

我希望输出为:

dt3 <- 具有列名 (a,b,c,d,e,f)

a b c d e f

1 2 3 4 5 6

1 2 3 4 5 6

1 2 3 4 5 6

我们可以使用 setdiff 来获取一个列在另一个列中找不到的列

nm1 <- setdiff(names(dt2), names(dt1))
out <- cbind(dt1, dt2[nm1])

如果我们有多个数据集,将其放在 list 中获取 intersecting 列名称(所有名称都是通用的),从中获取 setdiff listcbind

中每个单独数据集的列名
lst1 <- list(dt1, dt2, dt3)
nm2 <- Reduce(intersect, lapply(lst1, names))
cbind(lst1[[1]], do.call(cbind,
    lapply(lst1[-1], function(dat) dat[setdiff(names(dat), nm2)] )))
#    a  b  c  d  e  f  g
#1   1 11 21 31 41 51 61
#2   2 12 22 32 42 52 62
#3   3 13 23 33 43 53 63
#4   4 14 24 34 44 54 64
#5   5 15 25 35 45 55 65
#6   6 16 26 36 46 56 66
#7   7 17 27 37 47 57 67
#8   8 18 28 38 48 58 68
#9   9 19 29 39 49 59 69
#10 10 20 30 40 50 60 70

或使用 for 循环

out1 <- dt1 # initialize with the first data
for(i in 2:length(lst1)) {

    out1 <- cbind(out1, lst1[[i]][setdiff(names(lst1[[i]]), nm2)])
}
out1

数据

dt1 <- as.data.frame(matrix(1:50, 10, 5, dimnames = list(NULL, letters[1:5])))
dt2 <- as.data.frame(matrix(11:60, 10, 5, dimnames = list(NULL, letters[c(1:4, 6)])))
dt3 <-  as.data.frame(matrix(21:70, 10, 5, 
     dimnames = list(NULL, letters[c(1:4, 7)])))

一行:

library(dplyr)
dt1 %>%
    bind_cols(select(dt2, -one_of(names(.))))

这将适用于更多数据集,即您可以在下面添加另一行带有 dt3 的行。

又大又糟但是:您尝试做的事情不一定在每种情况下都有意义。如果数据集中的行数不同怎么办?如果具有相同名称的列包含不同的数据怎么办?不同的数据类型呢? ...

I just want to do some simple table combining with R using cbind

如果您正在尝试使用一种显然 天生就是为了做那样的事情,但实际上并非如此 的语言,有时退后一步是有意义的质疑你的方法。 为什么 您要select 那些栏目? 目标是什么? 有哪些要求? 这些数据来自哪里它会去哪里?我怀疑在这种情况下,有比尝试查找不同名称的列更好的方法来完成您正在尝试做的事情。

如果您对此进行详细说明,我将很乐意为您推荐一种更稳健的方法来实现您的目标!


数据

dt1 <- data.frame(a = 1, b = 2, c = 3, d = 4, e = 5)
dt2 <- data.frame(a = 1, b = 2, c = 3, d = 4, f = 6)