如何遍历多个 data.frames 的元素

How to loop through elements of several data.frames

我想遍历具有相同编号或 ID 的不同 data.frames 的元素:df1、df3、df4、df66、df76,此外我们还有 pp1、pp3、pp4、pp66、pp76 和 dd1 , dd3, dd4, dd66, dd76。每个 data.frame 有两列频率和能量:

df1 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
df3 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
df4 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
df66 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
df76 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))

pp1 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
pp3 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
pp4 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
pp66 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
pp76 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))

dd1 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
dd3 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
dd4 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
dd66 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))
dd76 = as.data.frame(cbind("frequency"= runif(140) ,"energy"=runif(140)))

所以首先我们创建一个 ID 向量来循环遍历这些数字

ID = c(1, 3, 4, 66, 76)

我试过了,显然不行

for (i in ID){
   dfmaster[i] <-  df[i]$frequency + pp[i]$frequency + dd[i]$frequency
}

我也尝试过将 paste0 用作:

for (i in ID){
   paste0("dfmaster",i) <-  paste0("df",i)+paste0("pp",i)+paste0("dd",i)}

因为这会创建一个角色。但实际上我会如何处理例如 matlab。

@Peter 关于制作可重现示例的评论非常相关,但您的问题很清楚,可以提供一些一般性建议,尽管在没有测试数据的情况下,这都是未经测试的代码。

循环遍历对象的“R 方式”是使用 lists。您可以将独立对象放入这样的列表中:

dfList <- list(df1, df3, df4, df66, df76)
ppList <- list(pp1, pp3, pp4, pp66, pp76)
ddList <- list(dd1, dd3, dd4, dd66, dd76)

虽然同时创建它们和列表会更有效率。

一旦对象在列表中,您就可以写:

dfMaster <- lapply(
              1:length(dfList),
              function(i) {
                dfList[[i]]$frequency + ppList[[i]]$frequency + ddList[[i]]$frequency
              }
            )

其中 lapply 将第二个参数中的函数应用于其第一个参数的每个元素,并且 returns 一个 list.

或者,如果您想使用 for 循环,您可以这样写:

dfMaster <- list()

for(i in 1:length(dfList)) {
  dfMaster[[i]] <- dfList[[i]]$frequency + 
                     ppList[[i]]$frequency + ddList[[i]]$frequency
}

[注意这里需要在运行循环之前声明一个空列表来包含for循环的结果。]

虽然我通常会避免 for 循环,因为你很容易被 lazy evaluation 抓住。

如果 ID 相关,您可以为列表的元素命名;

ID <- c(1, 3, 4, 66, 76)
names(dfList) <- ID
names(ppList) <- ID
names(ddList) <- ID

dfMaster <- lapply(
  ID,
  function(i) {
    dfList[[i]]$frequency + ppList[[i]]$frequency + ddList[[i]]$frequency
  }
)

或者在创建列表时命名列表的元素:

dfList <- list("1"=df1, "3"=df3, "4"=df4, "66"=df66, "76"=df76)