【问题标题】:Adding data from vector to matrix将数据从向量添加到矩阵
【发布时间】:2021-03-12 05:54:42
【问题描述】:

我有一个国家向量 p 和一个国家矩阵 Z。 p中的一些国家不包括在Z中。 我想要一个论点,如果它们尚未包含在 Z 中,则将国家从 p 添加到 Z,但前提是它们的值 > 0。

以下是数据示例。在预期输出中,应将澳大利亚添加到 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

【问题讨论】:

  • 你能清理你的代码吗? jt 未定义
  • 结果矩阵的维度应该是多少? 4*5(加一列澳大利亚)还是5*5(加一列一行)?
  • 已更新。我希望尺寸为 5x5 - 不清楚不清楚。
  • p 是数据帧还是向量?
  • 在 R 中,p 是一个数据框。

标签: r matrix


【解决方案1】:

cbindrbind 的组合可以解决问题。我在 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。这就是产生问题的原因。
  • dput(p) 对于评论来说太长了,我在下面添加了它作为答案。
【解决方案2】:

在您的评论中有新信息后的编辑版本:检查:

# your given matrix
p <- as.matrix(c(Afghanistan = 2769, 
                 Albania = 93893300, 
                 Algeria = 0, 
                 Argentina=4550430, 
                 Australia=50)) # a matrix of 5 values

p_transpose <- t(p)   # transpose matrix p

for(j in seq(ncol(p)))
  if(! all(p[, j] == p_transpose[j, ])) stop("wrong transpose")  # https://stat.ethz.ch/R-manual/R-devel/library/base/html/t.html


p_transpose_dataframe <- as.data.frame(p_transpose)  # p_transpose to dataframe


# your given main matrix
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 = 5, ncol = 4, byrow=TRUE) # matrix Z
colnames(Z) <- c("Afghanistan","Albania","Algeria", "Argentina")    # name columnes

Z <- as.data.frame(Z)   # make a dataframe Z

# helper function: code from here: # reference: https://stackoverflow.com/questions/45857787/adding-column-if-it-does-not-exist
fncols <- function(data, cname) {
  add <-cname[!cname%in%names(data)]
  
  if(length(add)!=0) data[add] <- 0
  data
} 

newZ <- fncols(Z, colnames(p_transpose_dataframe))   # helper functions to add not existing columns to Z and assign to new dataframe


result_Z <- rbind(newZ, p_transpose_dataframe)     # result dataframe
View(result_Z)                                     # View result dataframe

请提供反馈。

【讨论】:

  • 这可能有效,但我的真实数据包含很多国家/地区,因此像Z$Australia &lt;- 0 中手动添加它们并不是一个真正的选择。代码是否可以以某种方式自动化以仅在 p 中添加唯一的国家/地区?
猜你喜欢
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2012-08-11
相关资源
最近更新 更多