如何遍历多个 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 方式”是使用 list
s。您可以将独立对象放入这样的列表中:
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)
我想遍历具有相同编号或 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 方式”是使用 list
s。您可以将独立对象放入这样的列表中:
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)