gpt4 book ai didi

r - 按列名合并 R

转载 作者:行者123 更新时间:2023-12-02 06:37:13 25 4
gpt4 key购买 nike

我有

a <- matrix(c(1,3,4,2,2,6,3,1,6), nrow = 3, ncol=3, byrow=TRUE, dimnames = list(NULL, c("Apples", "Pears", "Oranges")))

Pears Apples Oranges
1 1 3 4
2 2 2 6
3 3 1 6

b <- matrix(c(1,3,2,6,3,6), nrow = 3, ncol=2, byrow=TRUE, dimnames = list(NULL, c( "Pears", "Oranges")))

Pears Oranges
1 1 4
2 2 6
3 3 6

我想合并它们以获得这样的结果:

 Pears Apples Oranges
1 1 3 4
2 2 2 6
3 3 1 6
4 1 Na 4
5 2 Na 6
6 3 Na 6

即,按列名组合它们,在第二帧缺少值的地方保留 Na/s,对于矩阵 a 较大,矩阵 b 较小的一般情况

rbind 不起作用,merge 做了一些奇怪的事情。我在追求什么?我也可以使用内存效率最高的可用方法,因为这最终会完成很多次,并且有很多列名。

谢谢,

-N

编辑:我最初问的时候可能应该提到这一点,但我实际上想达到上面的确切效果,但有一些非常重要的警告:

我正在使用矩阵

第一个矩阵总是包含比第二个矩阵更多的列名

我可能想从包 bigmemory 创建一个 big.matrix。

最佳答案

这是一个更通用的方法,以防您在 a 中有多个列和 b需要添加的:

b.toAdd <- setdiff (names(a), names(b))
if (length(b.toAdd))
b[, b.toAdd] <- NA

a.toAdd <- setdiff (names(b), names(a))
if (length(a.toAdd))
a[, a.toAdd] <- NA

rbind(a, b)

更新:

刚刚注意到您关于需要内存效率的评论。在这种情况下,您可能想使用 data.table自从使用 <-将创建不必要的副本。
data.table istead 有一个 :=运算符效率明显更高。

library(data.table)
a <- data.table(a)
b <- data.table(b)


if (length(b.toAdd <- setdiff (names(a), names(b))))
b[, c(b.toAdd) := NA]

if (length(a.toAdd <- setdiff (names(b), names(a))))
a[, c(a.toAdd) := NA]

rbind(a, b, use.names=TRUE)

# Pears Apples Oranges
# 1: 1 3 4
# 2: 2 2 6
# 3: 3 1 6
# 4: 1 NA 4
# 5: 2 NA 6
# 6: 3 NA 6

在 SO 中搜索 [r] data.table benchmarks了解改进

关于r - 按列名合并 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15602581/

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