我有使用列表以有组织的方式存储值的代码,以及执行复杂计算的矩阵函数.我想将矩数组注入相应列表的正确部分.列名在列表和矩阵之间有所不同(因为能够嵌套在列表中并在不同级别分配名称,这对于管理复杂的数据集非常方便和重要),但它们具有共性.如何通过匹配这些公共标识符来系统地将矩数组注入列表的正确部分,如下图所示?在本例派生的更完整的代码中,列表和mat1的类似功能是动态的:因此,我正在寻找一种系统的方式来实现这一点.

在下面的示例中,常见的标识符是"Series"、"Class"和"P_Advance".

生成示例函数和矩阵的代码在本文的底部.

enter image description here

下面是classPrin()函数和生成矩阵mat1的代码:

seriesList <- list(
  Series_One = data.frame(
    Class = c('Class_A','Class_B','Class_C'),
    ClassPct = c(0.5,0.2,0.06)
  ),
  Series_Two = data.frame(
    Class = c('Class_A','Class_B'),
    ClassPct = c(0.7,0.3)
  )
)

classPrin <- function(periods) {
  series_names <- c("Series_One","Series_Two")
  bucket <- list()
  
  for (series in series_names) {
    series_elements <- seriesList[[series]][["Class"]]
    bucket[[series]] <- list()
  
    for (element in series_elements) {
      mat <- matrix(0, nrow = periods, 2)
      colnames(mat) <- c(
        'P_advance',
        'FC_cover_CO'
      )
      mat[,"P_advance"] <- 0
      bucket[[series]][[element]] <- mat
    } 
  } 
  return(bucket)
}

mat1 <- matrix(0, nrow = 5, ncol = 3)
colnames(mat1) <- c(
  "Series_One_Class_A_P_advance",
  "Series_One_Class_B_P_advance",
  "Series_Two_Class_A_P_advance"
)
mat1[,1] <- 1:5
mat1[,2] <- 11:15
mat1[,3] <- 21:25

推荐答案

这里有一种方法,尽管我怀疑我的for-loop方法是不是很幼稚.我认为这是一个常见的问题,肯定有一种巧妙的方法来做到这一点.也许不会.作为R的新手(我不知道我还能坚持这个借口多久),我的第一个冲动是使用for循环进行攻击.但下面的方法是可行的.

classPrin5 <- classPrin(5)

# Function to insert values from mat1 into object generated by classPrin()
insertValues <- function(classPrinList, mat, prefix) {
  for (series_name in names(classPrinList)) {
    for (class_name in names(classPrinList[[series_name]])) {
      col_name <- paste(series_name, class_name, "P_advance", sep = "_")
      if (col_name %in% colnames(mat)) {
        values_to_insert <- mat[, col_name]
        classPrinList[[series_name]][[class_name]][,"P_advance"] <- values_to_insert
      }
    }
  }
  return(classPrinList)
}

# Run the function
insertValues(classPrin5, mat1)

它会给出以下正确的输出:

> insertValues(classPrin5, mat1)
$Series_One
$Series_One$Class_A
     P_advance FC_cover_CO
[1,]         1           0
[2,]         2           0
[3,]         3           0
[4,]         4           0
[5,]         5           0

$Series_One$Class_B
     P_advance FC_cover_CO
[1,]        11           0
[2,]        12           0
[3,]        13           0
[4,]        14           0
[5,]        15           0

$Series_One$Class_C
     P_advance FC_cover_CO
[1,]         0           0
[2,]         0           0
[3,]         0           0
[4,]         0           0
[5,]         0           0


$Series_Two
$Series_Two$Class_A
     P_advance FC_cover_CO
[1,]        21           0
[2,]        22           0
[3,]        23           0
[4,]        24           0
[5,]        25           0

$Series_Two$Class_B
     P_advance FC_cover_CO
[1,]         0           0
[2,]         0           0
[3,]         0           0
[4,]         0           0
[5,]         0           0

R相关问答推荐

重复组的运行计数

将收件箱变量传递给ggplot 2函数

R gtsummary tBL_summary,包含分层和两个独立分组变量

如何在R中正确对齐放射状图中的文本

Tidyverse/Djirr为从嵌套列表中提取的列名赋值的解决方案

咕噜中的元素列表:map

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

线性模型斜率在减少原始数据时提供NA

`lazy_dt`不支持`dplyr/across`?

更改STAT_VALLES/STAT_PEAKS中的箭头线宽/大小

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

为什么在BASE R中绘制线条时会看到线上的点?

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

解析嵌套程度极高的地理数据

向R中的数据帧添加一列,该列统计另一列中每个唯一值的二进制观测值的数量

用多边形替换地块点

如何显示准确的p值而不是<;0.001*?

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

如何将EC50值绘制在R中的剂量-react 曲线上?