【发布时间】:2020-12-07 14:44:11
【问题描述】:
我想在一个列表上运行一个 for 循环。我有 3 个问题:
- 我想知道如何选择“i in 1:list”中的每个列表,当对数据框执行相同操作时,它可以是 for(i in 1:ncol(df)),但是应该如何为列表?
- 我还想知道如何将每个循环的值“添加”到“输出”矩阵?
- 如何将列表转换为数据框。像 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 <- matrix(nrow=6, ncol=2),所以你已经将output初始化为某个大小——只要确保这个大小是你想要的最终大小。 -
也很难判断您的设置发生了什么。例如,你有
df <- data.frame(name,id, q1,q2),所以df是一个数据框。然后你做df <- list(df),所以现在df是一个只包含一个数据框的列表。然后同上df2。然后当您执行df3 <- list(df, df2)时,您有一个包含 2 个项目的列表,每个项目都是一个包含单个数据框的列表 - 一个相对复杂的数据结构。
标签: r