【发布时间】:2022-12-11 02:54:02
【问题描述】:
请问我如何用 R 语言比较一个表(属性:起始机器名称、目标机器名称和增量 id)和一个空矩阵(我们在列中有目标机器名称,在列中有起始机器名称行)。如果开始和结束之间存在匹配项,那么我想使用数组中的增量 id 值进行编译。
我希望数组内部是增量 id
【问题讨论】:
-
请提供足够的代码,以便其他人可以更好地理解或重现问题。
标签: r matrix multiple-columns
请问我如何用 R 语言比较一个表(属性:起始机器名称、目标机器名称和增量 id)和一个空矩阵(我们在列中有目标机器名称,在列中有起始机器名称行)。如果开始和结束之间存在匹配项,那么我想使用数组中的增量 id 值进行编译。
我希望数组内部是增量 id
【问题讨论】:
标签: r matrix multiple-columns
如果您能提供一个可重现的示例 (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
)
}
}
}
如果同一机器对有多个值,则数据框中的最后一个值将擦除其他值。
【讨论】:
Numero incrementale)) { tabellaMatrice[i ,j]<-tab2$Numero incrementale[p] } ,"") },"") } } }