如何列绑定 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
中获取 intersect
ing 列名称(所有名称都是通用的),从中获取 setdiff
list
和 cbind
中每个单独数据集的列名
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)
我想加入 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
中获取 intersect
ing 列名称(所有名称都是通用的),从中获取 setdiff
list
和 cbind
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)