微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在r中按行名对不合格矩阵求和

如何解决在r中按行名对不合格矩阵求和

我有两个大小不相等的矩阵,这是一个小样本(我的真实矩阵大得多):

s <- matrix(1:36,nrow = 6,ncol = 6,byrow=TRUE,dimnames = list(c("Afghanistan","Albania","Algeria","Argentina","Australia","Austria"),c("Afghanistan","Austria")))
s2 <- matrix(1:18,nrow = 3,ncol = 3,dimnames = list(c("Albania","Australia"),c("Albania","Australia")))

我想按行名汇总国家/地区值。由于在两个矩阵中仅存在一些行名,因此我需要将行名彼此匹配,然后在存在匹配项的地方将这些值求和。我该怎么办?

这是我想要的输出,将来自“ s2”的值添加到第一个矩阵“ s”:

enter image description here

这是我完整数据的dput:

> dput(head(s))
structure(c(0,93,9937,21,281786,1.33333333333333,45.3333333333333,6,12.3333333333333,2,51.6666666666667,48,13,2174287.66666667,1,239.5,5,33000,498766.333333333,103470.333333333,0),.Dim = c(6L,179L),.Dimnames = list(c("Afghanistan","Antigua and Barbuda","Armenia"
),"Armenia","Aruba","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Bermuda","Bhutan","Bolivia (Plurinational State of)","Bosnia and Herzegovina","Botswana","Brazil","Brunei Darussalam","Bulgaria","Burkina Faso","Burundi","Côte d'Ivoire","Cabo Verde","Cambodia","Cameroon","Canada","Central African Republic","Chile","China,Hong Kong SAR",Macao SAR",mainland",Taiwan Province of","Colombia","Comoros","Congo","Cook Islands","Costa Rica","Croatia","Cuba","Cyprus","Czechia","Democratic Republic of the Congo","Denmark","Djibouti","Dominica","Ecuador","Egypt","El Salvador","Estonia","Eswatini","Ethiopia","Faroe Islands","Fiji","Finland","France","french polynesia","Gabon","Gambia","Georgia","Germany","Ghana","Greece","Greenland","Guatemala","Guinea","Guyana","Honduras","Hungary","Iceland","India","Indonesia","Iran (Islamic Republic of)","Ireland","Israel","Italy","Jamaica","Japan","Jordan","Kazakhstan","Kenya","Kiribati","Kuwait","Kyrgyzstan","Latvia","Lebanon","Libya","Lithuania","Luxembourg","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Mauritania","Mauritius","Mexico","Mongolia","Montenegro","Morocco","Namibia","Nepal","Netherlands","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","north Macedonia","norway","Oman","Pakistan","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Poland","Portugal","Qatar","Republic of Korea","Republic of Moldova","Romania","Russian Federation","Rwanda","Saint Kitts and Nevis","Saint Lucia","Saint vincent and the Grenadines","Sao Tome and Principe","Saudi arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","South Africa","Spain","Sri Lanka","Suriname","Sweden","Switzerland","Thailand","Togo","Tonga","Tunisia","Turkey","Uganda","Ukraine","United arab Emirates","United Kingdom of Great Britain and northern Ireland","United Republic of Tanzania","United States of America","Uruguay","Vanuatu","Venezuela (Bolivarian Republic of)","Yemen","Zambia","Zimbabwe","Unspecified Area","Viet Nam","Syrian arab Republic","Myanmar","Benin","Mozambique","Trinidad and Tobago","Lao People's Democratic Republic","Tajikistan","Angola","Iraq","Dominican Republic")))
> 

> dput(head(s2))
structure(c(0,23664.36,9.6,162.18,2.46,19022.82,56.4,1.02,2127.96,2.88,1137.12,1518.75,1.98,129.48,3615.06,0.18,18.72,720,0.36,7458,0.06,1170,6725.28,0.6,0.09,4045.38,629.28,2160,34889.88,35.7,84.66,18163.68,5001.21,1080,3212.64,22.62,67.92,9.72,181L),.Dimnames = list(
    c("Albania","Aruba"),"Grenada","Montserrat","Tuvalu","South Sudan","Equatorial Guinea","Dominican Republic","Democratic People's Republic of Korea"
    )))


例如,阿富汗包含在“ s”中,但不包含在“ s2”中。

解决方法

您可以将rbind转换为data.frame转换后的matrix并使用xtabs进行汇总:

tt <- rbind(as.data.frame(as.table(s)),as.data.frame(as.table(s2)))
xtabs(Freq ~ Var1 + Var2,tt)
#             Var2
#Var1          Afghanistan Albania Algeria Argentina Australia Austria
#  Afghanistan           1       2       3         4         5       6
#  Albania               7       9      11        10        14      12
#  Algeria              13      18      20        16        23      18
#  Argentina            19      20      21        22        23      24
#  Australia            25      33      35        28        38      30
#  Austria              31      32      33        34        35      36
,

我希望我理解正确。如果没有,请提供您要达到的矩阵作为最终输出。

class A {
 private:
  std::unique_ptr<std::ostream> out;

 public:
  A(std::unique_ptr<std::ostream> o) : out(std::move(o)) {
    out->write("test",4);
  }

  void writeTest2() {
    out->write("test2",5);
    out->flush();
  }
};

int main() {
  A a{std::make_unique<std::ofstream>("testic")};
  a.writeTest2();
}
,

我认为这就是您要寻找的。我不知道这是否是最佳方法,但是它可以工作。

s <- matrix(1:36,nrow = 6,ncol = 6,byrow=TRUE,dimnames = list(c("Afghanistan","Albania","Algeria","Argentina","Australia","Austria"),c("Afghanistan","Austria")))
s2 <- matrix(1:18,nrow = 3,ncol = 3,dimnames = list(c("Albania","Australia"),c("Albania","Australia")))

s_new<-s[rownames(s) %in% rownames(s2),]
s_new<-s_new[,colnames(s_new) %in% colnames(s2)]

s_new<-s_new[,order(colnames(s_new))]
s2<-s2[,order(colnames(s2))]

Final<-s_new+s2

s1<-s
for( i in 1:dim(s1)[2])
{
  for( j in 1:dim(s1)[1])
  {
  s1[i,j]<-ifelse(rownames(s1)[i] %in% rownames(Final) & colnames(s)[j] %in% colnames(Final),Final[which(rownames(Final)==rownames(s)[i]),which(colnames(Final)==colnames(s)[j])],s1[i,j])
  }
}
,

您可以尝试下面的代码

s2names <- dimnames(s2)
s[s2names[[1]],s2names[[2]]] <- s[s2names[[1]],s2names[[2]]] + s2

这样

            Afghanistan Albania Algeria Argentina Australia Austria
Afghanistan           1       2       3         4         5       6
Albania               7       9      11        10        14      12
Algeria              13      18      20        16        23      18
Argentina            19      20      21        22        23      24
Australia            25      33      35        28        38      30
Austria              31      32      33        34        35      36
,

这应该做。

s1<-s
for( i in 1:dim(s1)[2])
{
  for( j in 1:dim(s1)[1])
  {
    s1[i,j]<-ifelse(rownames(s1)[i] %in% rownames(s2) & colnames(s)[j] %in% colnames(s2),j]+s2[which(rownames(s2)==rownames(s)[i]),which(colnames(s2)==colnames(s)[j])],j])
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。