gpt4 book ai didi

r - 根据行和列指定添加矩阵

转载 作者:行者123 更新时间:2023-12-01 08:14:22 26 4
gpt4 key购买 nike

我确信这个问题的答案在某处,但我认为我没有使用正确的搜索词。

这是我的问题。我有多个矩阵(我将在这里简化为两个),其中每一行都是一个唯一标记的个体(其中一些在矩阵之间共享,而另一些则不是),以及共享的公共(public)列标题。

例如:

first<-matrix(rbinom(20,1,.5),4,5)
first[,1]=c(122,145,186,199)
colnames(first)<-c("ID",901,902,903,904)
first
ID 901 902 903 904
[1,] 122 1 0 0 0
[2,] 145 0 0 0 1
[3,] 186 0 0 1 1
[4,] 199 1 0 0 0

second<-matrix(rbinom(30,1,.5),6,5)
second[,1]=c(122,133,142,151,186,199)
colnames(second)<-c("ID",901,902,903,904)
second
ID 901 902 903 904
[1,] 122 0 1 1 1
[2,] 133 0 0 0 1
[3,] 142 1 1 0 1
[4,] 151 0 1 0 0
[5,] 186 1 0 1 1
[6,] 199 1 0 0 0

我想根据“ID”和列名将“first”和“second”添加在一起。这应该会产生一个包含 7 行的矩阵(因为“第一个”矩阵中有 4 个 ID,“第二个”矩阵中有 3 个新 ID 和 3 个旧 ID:“122,133,142,145,151,186,199”),以及相同数量的列。

在这个例子中,我想要的结果是:

      ID 901 902 903 904
[1,] 122 1 1 1 1
[2,] 133 0 0 0 1
[3,] 142 1 1 0 1
[4,] 145 0 0 0 1
[5,] 151 0 1 0 0
[6,] 186 1 0 2 2
[7,] 199 2 0 0 0

最佳答案

原始答案

基于@RYogi 使用行名和列名来描述矩阵的方法,我提出以下建议:

res <- rbind(first,second)
res <- tapply(res, expand.grid(dimnames(res)), sum)

所有具有相同行名的行将被求和。

使用数据框时

如果您的输入是 data.frame,则上述方法将不起作用,因为 data.frame 不能有任何重复的行名称。另一种方法也适用于此:

rowsum(rbind(first, second), c(rownames(first), rownames(second)))

这种方法也适用于矩阵。由于它只需要一行,您可能会认为它更简单。我想它也可能更有效,因为它不如 tapply 通用。您可以将此解决方案调整为您问题中的数据格式,其中标识符位于单独的列中:

rowsum(rbind(first, second)[,-1], c(first[,1], second[,1]))

请注意,结果仍将包含命名行,而不是包含这些名称的列。

有趣的是,我在寻找 rowSums 时无意中读到了关于 rowsum 的内容问题在这里。幸运的我。

其他提示

如果您发现维度的结果名称 Var1Var2 令人困惑,您可以使用删除它们

names(dimnames(res)) <- NULL

如果您的数据确实是您所描述的格式,并且行名在第一个数据列中,您可以使用以下命令将它们更改为正确的行名:

rownames(first) <- first[,1]
first <- first[,-1]

关于r - 根据行和列指定添加矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585242/

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