【问题标题】:Run a for loop over a list, save each list object in output matrix在列表上运行 for 循环,将每个列表对象保存在输出矩阵中
【发布时间】:2020-12-07 14:44:11
【问题描述】:

我想在一个列表上运行一个 for 循环。我有 3 个问题:

  1. 我想知道如何选择“i in 1:list”中的每个列表,当对数据框执行相同操作时,它可以是 for(i in 1:ncol(df)),但是应该如何为列表?
  2. 我还想知道如何将每个循环的值“添加”到“输出”矩阵?
  3. 如何将列表转换为数据框。像 data.frame(df3) 一样执行此操作时,它们将按列添加,行数将始终为 3。

如果有人有建议,非常感谢!

    name <- rep("gg",3) 
id <- LETTERS[1:3]
emmeans <- runif(1:3)
SE <- runif(1:3)
p <- rep(c(0.001),3)
df <- data.frame(name,id, emmeans,p)
df
df  <- list(df)

name <- rep("ff",3) 
id <- LETTERS[1:3]
emmeans <- runif(1:3)
SE <- runif(1:3)
p <- rep(c(0.003),3)

df2 <- data.frame(name,id, emmeans,p)
df2 <- list(df2)

df3 <- list(df,df2)
df3
> df3
[[1]]
[[1]][[1]]
  name id   emmeans     p
1   gg  A 0.2248491 0.001
2   gg  B 0.4213938 0.001
3   gg  C 0.3671521 0.001


[[2]]
[[2]][[1]]
  name id   emmeans     p
1   ff  A 0.2561801 0.003
2   ff  B 0.1705811 0.003
3   ff  C 0.9714178 0.003

output <- matrix(nrow=2, ncol=5)

for(i in 1:list){ # what could be written here?
  d <- as.data.frame(df3[[i]])
  for(j in 1:nrow(d)){
    output[i,1] <- d[1,3]
    output[i,2] <- d[2,3]
    output[i,3] <- d[3,3]
    output[i,4] <- d[1,4]
    output[i,5] <- d[1,1]
  }
}

#Wanted outcome:
output
     [,1]                [,2]                [,3]                [,4]    [,5]
[1,] "0.224849119782448" "0.421393777942285" "0.367152112303302" "0.001" "gg"
[2,] "0.256180095253512" "0.170581063022837" "0.971417842432857" "0.003" "ff"

【问题讨论】:

  • 1. length(df3), 2. cbind, 3. dplyr::bind_rows(df3)
  • 但是 (2) 效率非常低 - 设置为使您的输出矩阵从一开始就具有正确的大小,然后在循环中用您的实际结果替换默认值,而不是“增长”每次迭代都使矩阵变大。
  • @Gregor Thomas 感谢您的回复!你对如何做到这一点有什么建议吗?
  • 我无法理解您的实际目标是什么。你有output &lt;- matrix(nrow=6, ncol=2),所以你已经将output初始化为某个大小——只要确保这个大小是你想要的最终大小。
  • 也很难判断您的设置发生了什么。例如,你有df &lt;- data.frame(name,id, q1,q2),所以df 是一个数据框。然后你做df &lt;- list(df),所以现在df 是一个只包含一个数据框的列表。然后同上df2。然后当您执行df3 &lt;- list(df, df2) 时,您有一个包含 2 个项目的列表,每个项目都是一个包含单个数据框的列表 - 一个相对复杂的数据结构。

标签: r


【解决方案1】:

这些数据的结构很奇怪,提取也很独特,我认为for 循环是最简单的方法。像这样的:

output <- matrix(nrow = length(df3), ncol=5)
for(i in seq_along(df3)) {
  output[i, ] = with(df3[[i]], c(emmeans, p[1], name[1]))
}
output
#      [,1]                 [,2]               [,3]                [,4]    [,5]
# [1,] "0.0101301828399301" "0.21454192395322" "0.913734979229048" "0.003" "ff"
# [2,] "0.0101301828399301" "0.21454192395322" "0.913734979229048" "0.003" "ff"

【讨论】:

    猜你喜欢
    • 2021-05-02
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多