Warm tip: This article is reproduced from serverfault.com, please click

r-将向量中的数据添加到矩阵

(r - Adding data from vector to matrix)

发布于 2020-11-30 09:57:02

我有一个国家的向量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
Questioner
MoonS
Viewed
0
Edo 2020-11-30 20:29:07

的组合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