【问题标题】:Populate an empty matrix with values after comparing column and row in R比较 R 中的列和行后用值填充空矩阵
【发布时间】:2022-12-11 02:54:02
【问题描述】:

请问我如何用 R 语言比较一个表(属性:起始机器名称、目标机器名称和增量 id)和一个空矩阵(我们在列中有目标机器名称,在列中有起始机器名称行)。如果开始和结束之间存在匹配项,那么我想使用数组中的增量 id 值进行编译。

enter image description here

enter image description here

我希望数组内部是增量 id

【问题讨论】:

  • 请提供足够的代码,以便其他人可以更好地理解或重现问题。

标签: r matrix multiple-columns


【解决方案1】:

如果您能提供一个可重现的示例 (https://reprex.tidyverse.org/),那就太好了。根据您的图像,我假设您的数据集如下所示:

machine_table <- data.frame(
  incremental_id = rep(1:2, times=5),
  start_machine = paste0("A", 1:5),
  target_machine = factor(c("A1", "A2"), levels = paste0("A", 1:5))
)

machine_table

要创建您的矩阵,您有多种可能性,在这里您将首先使用匹配的起始机器和目标机器过滤行,然后再旋转并转换为矩阵。

首先,将机器列转换为我们已知的因子。

machine_table$start_machine <-  factor(machine_table$start_machine, levels = paste0("A", 1:5))
machine_table$target_machine <- factor(machine_table$target_machine, levels = paste0("A", 1:5))

然后仅选择机器匹配的行并旋转轴心并使用不匹配的机器名称展开。您可以使用 machine_table 代替 pivot_wider 中的 match 对整个数据集执行相同的操作。

match <- machine_table[machine_table$start_machine == machine_table$target_machine, ]
match_table <- tidyr::pivot_wider(match, 
                   id_cols = "start_machine",  id_expand = T,
                   names_from = "target_machine", names_expand = T,
                   values_from =  "incremental_id")

之后你只需要将这个表转换为矩阵,并重命名行

machine_matrix <- as.matrix(match_table[, -1])
row.names(machine_matrix) <- match_table$start_machine
machine_matrix

如果一对机器有多个值,您可以指定一个聚合函数,如 min、max、sd 等,作为 values_fnpivot_wider 中的参数。

编辑: 根据您的评论,这是一种带有 for 循环的方法,循环遍历矩阵的所有行和列以及数据帧的行。

for (i in seq(nrow(tabellaMatrice))) {
  for (j in seq(ncol(tabellaMatrice))) {
    for (r in seq(nrow(tab2))) {
      ifelse(tab2$Da[r]==rownames(tabellaMatrice)[i] & tab2$A[r]==colnames(tabellaMatrice)[j],
             tabellaMatrice[i,j] <- tab2$`Numero incrementale`[r],
             NA
      )
    }
  }
}

如果同一机器对有多个值,则数据框中的最后一个值将擦除其他值。

【讨论】:

  • 抱歉,但不起作用。我正在尝试用一个循环来完成这部分:
  • for (i in nrow(rownames(tabellaMatrice))) { for (j in ncol(colnames(tabellaMatrice))) { for (r in nrow(tab2$Da)) { ifelse(tab2$Da[r]==rownames( tabellaMatrice)[i], for (o in nrow(tab2$A)) { ifelse(tab2$A[o]==colnames(tabellaMatrice), for (p in nrow(tab2$Numero incrementale)) { tabellaMatrice[i ,j]<-tab2$Numero incrementale[p] } ,"") },"") } } }
猜你喜欢
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多