我有一个国家的向量p和一个国家的矩阵Z。p中的某些国家/地区不包含在Z中。我想提出一个论点,即如果p中的国家/地区尚未包含在Z中(但前提是它们的值大于0),则将这些国家/地区添加到Z中。
这是数据的示例。在预期的输出中,应将澳大利亚添加到Z,所有矩阵列均应为0,因为它没有要报告的矩阵数据。矩阵尺寸应为5x5。
p <- c(Afghanistan = 2769, Albania = 93893300, Algeria = 0, Argentina=4550430, Australia=50, Ban = 2)
p <- stack(p)
names(p) <- c("Value", "Area")
#vector
Z <- matrix(c(0,138201.333333333,0,0,0,0,1162.33333333333,0,38.3333333333333,0,0,0,0,0,0,0,300238,0,9675,0), nrow = 4, ncol = 4, byrow=TRUE)
dimnames(Z) = list(c("Afghanistan","Albania","Algeria", "Argentina"),c("Afghanistan","Albania","Algeria", "Argentina")) #matrix
#matrix
的组合cbind
,并rbind
会做的伎俩。我在p中添加了一个附加元素,以表明它甚至可以使用更多名称。
# your data EDITED BASED ON THE DPUT you posted!!
p <- c(Afghanistan = 2769, Albania = 93893300, Algeria = 0, Argentina=4550430, Australia=50, Ban = 2)
p <- stack(p)
names(p) <- c("Value", "Area")
Z <- matrix(c(0,138201.333333333,0,0,0,0,1162.33333333333,0,38.3333333333333,0,0,0,0,0,0,0,300238,0,9675,0), nrow = 4, ncol = 4, byrow=TRUE)
dimnames(Z) = list(c("Afghanistan","Albania","Algeria", "Argentina"),c("Afghanistan","Albania","Algeria", "Argentina")) #matrix
# solution
to_add <- setdiff(p[p$Value>0, "Area"], unlist(dimnames(Z)))
Z <- cbind(Z, matrix(0, nrow(Z), length(to_add), dimnames = list(NULL, to_add)))
Z <- rbind(Z, matrix(0, length(to_add), ncol(Z), dimnames = list(to_add, NULL)))
Z
#> Afghanistan Albania Algeria Argentina Australia Ban
#> Afghanistan 0.00000 138201.3 0.000 0 0 0
#> Albania 0.00000 0.0 1162.333 0 0 0
#> Algeria 38.33333 0.0 0.000 0 0 0
#> Argentina 0.00000 0.0 0.000 0 0 0
#> Australia 0.00000 0.0 0.000 0 0 0
#> Ban 0.00000 0.0 0.000 0 0 0
谢谢,尽管我不确定如何在实际数据中使用此代码,但Z是从csv创建的大型矩阵。我尝试了您的代码,但它给了我“在Ops.factor(left,right):'>'对因子没有意义。”
请尝试进行此编辑。
您的错误看起来像是在创建时发生的事情
to_add
。请确保它class(p$p)
是数字。否则,请告诉我。嗯
class(p$p)
给我"NULL"
请分享
dput(p)
。看起来p数据帧的列未称为p。那就是产生您的问题的原因。