【问题标题】:R append rows from listed matrices to matrix/data frame while skipping over missing valuesR在跳过缺失值的同时将列出的矩阵中的行附加到矩阵/数据框
【发布时间】:2019-03-29 05:15:15
【问题描述】:

我试图找出一种方法来编写一个循环(或类似应用的函数),该循环从列表中的矩阵中获取特定行,将其写入矩阵/数据帧,从下一个列表元素,并将其放在同一行中的前一个元素之后。

这涉及一个嵌套列表,其中第一部分有五个矩阵,下一部分有五个矩阵,依此类推。每个矩阵块的列数可以不同,最少为 6,最多为 8。总是有四行。下面的示例在第一部分有 4x6 矩阵,在第二部分有 4x8 矩阵。

set.seed(100)
test.df <- data.frame(matrix(1:440,nrow=40,ncol=11))

mat1 <- matrix(rnorm(24),nrow=4,ncol=6)
mat2 <- matrix(rnorm(24),nrow=4,ncol=6)
mat3 <- matrix(rnorm(24),nrow=4,ncol=6)
mat4 <- matrix(rnorm(24),nrow=4,ncol=6)
mat5 <- matrix(rnorm(24),nrow=4,ncol=6)

mat6 <- matrix(rnorm(32),nrow=4,ncol=8)
mat7 <- matrix(rnorm(32),nrow=4,ncol=8)
mat8 <- matrix(rnorm(32),nrow=4,ncol=8)
mat9 <- matrix(rnorm(32),nrow=4,ncol=8)
mat10 <- matrix(rnorm(32),nrow=4,ncol=8)

test.list1 <- list(mat1,mat2,mat3,mat4,mat5)
test.list2 <- list(mat6,mat7,mat8,mat9,mat10)
list.f <- list(test.list1,test.list2)
res.mat <- matrix(nrow=2,ncol=40)

# (Edit) Example of expected results
res.mat[1,1:6] <- mat1[1,]
res.mat[1,9:14] <- mat2[1,]
res.mat[2,1:8] <- mat6[1,]
res.mat[2,9:16] <- mat7[1,]
res.mat
final.res <- cbind(test.df,res.mat)
final.res

嵌套列表的第一个列表中每个矩阵的第一行占据res.mat的第一行。 res.mat 的第一行将有六个条目,跳过两列(离开 NA),然后是接下来的六个条目,依此类推。 res.mat 的第二行将有八个条目,然后是接下来的八个,依此类推。填充 res.mat 后,我​​会将其附加到 test.df 作为最终结果。 test.df 中填充了一系列数字作为占位符。

我有两个以上更高级别的列表元素,但为了重现性,我只包含了两个。当它处理我的所有数据时,最终数据框中将有 2916 个列表元素和 2916 行。任何关于我如何实现这一点的想法将不胜感激,请询问我是否可以通过代码或描述澄清任何内容。

【问题讨论】:

  • 使用此示例输入,您能否提供至少几行预期输出?
  • 我添加了一些代码来演示预期的结果。这有助于可视化事物吗?

标签: r list loops matrix data-manipulation


【解决方案1】:

如果有人感兴趣,我确实想通了。这是解决方案:

format.dv <- function(list.f,test.df) {
nrow.f <- length(dvs)
  res.mat <- matrix(nrow=nrow.f,ncol=40)
  for (cond in 1:nrow(cond.list)) {
    ri <- 1
    min <- 1

    for (ri in 1:5) {

      data <- list.f[[cond]][[ri]]
      ncol <- dim(data)[2]
      adj <- 8 - ncol
      max <- 8
#Any number can be substituted for 1 depending on desired row to be taken
      pe.row <- data[1,]
      res.mat[cond,min:((max*ri)-adj)] <- pe.row
      min <- min+8
    }
  }
  res.mat <- round(res.mat,4)
  final.res <- cbind(test.df,res.mat)
  final.res
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多