【问题标题】:building a matrix with specific values using for loop in R使用 R 中的 for 循环构建具有特定值的矩阵
【发布时间】:2017-12-29 19:45:05
【问题描述】:

我想在 R 中使用 for 循环构建具有特定值的矩阵。

  • 列名:unique(flowdata$name)

  • 行名:unique(flowdata$attrs[which(flowdata$metadata=='name')])

  • Values:outputGroup 0 和 2.*

  • meanValue

下面是我的代码,但是当我运行它时,我得到一个错误提示

Error in `[<-`(`*tmp*`, row.name, col.name, value = 6876) : 
  subscript out of bounds

我要创建的矩阵:对于第一列“乙酸,植物”,它应该为“乙酸,植物(第 1 行)”返回值“1”,“0.18841”为“回收的能量,乙酸生产(第 2 行)"。

这是我缩短的示例数据:https://www.dropbox.com/s/10it07wqzfwctd6/Data_Sample.txt?dl=0

n.up = length(unique(flowdata$name)) # number of unit processes
n.p = length(unique(flowdata$attrs[which(flowdata$metadata=='name')]))
  #number of inputs/outputs

output.mat <- matrix(0,n.p,n.up) #empty matrix

colnames(output.mat) <- unique(flowdata$name) # up names
rownames(output.mat) <- 
    unique(flowdata$attrs[which(flowdata$metadata=='name')]) 
    # inputs/outputs names

# check output.mat size

data <- flowdata
for (i in 1:nrow(data)){ # for every row in data

if ((data$metadata[i]=='outputGroup' && data$attrs[i] == 0) || 
  (data$metadata[i]=='outputGroup' && data$attrs[i] == 2)){ # if it is an 
 #output and it is a reference product or a co-product

 col.name <- data$name[i] # up name
 row.name <- data$attrs[i-4] # i/o name

 value <- as.numeric(data$attrs[i-5]) #value

 output.mat[row.name,col.name] <- value
}
 }

output.mat <- output.mat[-which(rowSums(output.mat)==0),] # if the row is 
   #empty, then the flow was an input or output of no interest

【问题讨论】:

  • 如果您在问题中发布 small 可重现的数据样本,您可能会获得更快的帮助。真的那么复杂,需要让人去下载几千行数据来说明问题吗?大多数问题可以用不到 20 行数据来说明。
  • 如果您 (1) 提供 小型、可复制/粘贴 示例数据,(2) 描述您在文字和代码中所做的事情,以及 (3) 为您的示例输入显示所需的输出。您的问题文本描述了您的数据,但根本没有描述您的代码试图做什么。

标签: r for-loop matrix


【解决方案1】:

output.mat 返回值 0。您的代码不会按照您提供的那样运行;然而。在某些地方,您说您的数据存储在“flowdata”中,而在其他地方则存储在“data”中。下面是关于 out 的快速修复。

n.up = length(unique(flowdata$name)) # number of unit processes
n.p = length(unique(flowdata$attrs[which(flowdata$metadata=='name')]))
#number of inputs/outputs

output.mat <- matrix(0,n.p,n.up) #empty matrix

colnames(output.mat) <- unique(flowdata$name) # up names
rownames(output.mat) <- 
unique(flowdata$attrs[which(flowdata$metadata=='name')]) 
# inputs/outputs names

# check output.mat size

data <- flowdata
for (i in 1:nrow(data)){ # for every row in data

  if ((data$metadata[i]=='outputGroup' && data$attrs[i] == 0) || 
      (data$metadata[i]=='outputGroup' && data$attrs[i] == 2)){ # if it is an 
    #output and it is a reference product or a co-product

col.name <- data$name[i] # up name
row.name <- data$attrs[i-4] # i/o name

value <- as.numeric(data$attrs[i-5]) #value

output.mat[row.name,col.name] <- value
  }
}

output.mat <- output.mat[-which(rowSums(output.mat)==0),] # if the row is empty, then the flow was an input or output of no interest

print(output.mat)

输出如下:

                                            Acetic acid, at plant
Acetic acid, at plant                                     1.00000
Recovered energy, at acetic acid production               0.18841
Acrylonitrile, at plant                                   0.00000
Recovered energy, for acrylonitrile                       0.00000
                                        Acrylonitrile, at plant
Acetic acid, at plant                                     0.0000000
Recovered energy, at acetic acid production               0.0000000
Acrylonitrile, at plant                                   1.0000000
Recovered energy, for acrylonitrile                       0.0051834

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多