在r中相同大小的循环中创建空数据帧,并为它们指定另一个数据帧的名称?
aa、bb和cc是我必须使用loop创建的三个空数据帧,并将它们命名为df1的colname在r中相同大小的循环中创建空数据帧,并为它们指定另一个数据帧的名称?,r,dplyr,R,Dplyr,aa、bb和cc是我必须使用loop创建的三个空数据帧,并将它们命名为df1的colname df1=data.frame(name= c("x", "y", "m"), age=c(25,28,31), achivements= c(0,1,1)) **我试图获取的代码** stored_df_name= c("aa", "bb", "cc")
df1=data.frame(name= c("x", "y", "m"),
age=c(25,28,31),
achivements= c(0,1,1))
**我试图获取的代码**
stored_df_name= c("aa", "bb", "cc")
for(i in stored_df_name){
i= data.frame(matrix(nrow=3, ncol=3)
names(i) <- names(df1)
}
但是它不是创建3个数据帧,而是创建名为i of dim3,3的数据帧。这个基本R解决方案使用Lappy循环创建data.frames列表,然后从名称向量中指定列表成员的名称,最后将df放入.GlobalEnv
如果data.frames需要为空,请在矩阵中使用nrow=0运行上述代码。指令。此base R解决方案使用Lappy循环创建data.frames列表,然后从名称向量分配列表成员的名称,最后将df放入.GlobalEnv 如果data.frames需要为空,请在矩阵中使用nrow=0运行上述代码。说明。您也可以使用:
library(data.table)
df1 <- data.frame(name= c("x", "y", "m"),
age=c(25,28,31),
achivements= c(0,1,1))
stored_df_name= c("aa", "bb", "cc")
output <- vector("list", length = 3)
for(i in 1:length(stored_df_name)) {
output[[i]] <- as.data.frame(matrix(nrow = 3, ncol = 3))
names(output[[i]]) <- names(df1)
}
output <- setNames(output, stored_df_name)
> rbindlist(output[1])
name age achivements
1: NA NA NA
2: NA NA NA
3: NA NA NA
输出是一个长度为3的列表,每个组件都是一个数据帧。您可以使用data.table包中的rbindlist函数将每个或所有组件转换为单个或行绑定的数据帧。您也可以使用此功能:
library(data.table)
df1 <- data.frame(name= c("x", "y", "m"),
age=c(25,28,31),
achivements= c(0,1,1))
stored_df_name= c("aa", "bb", "cc")
output <- vector("list", length = 3)
for(i in 1:length(stored_df_name)) {
output[[i]] <- as.data.frame(matrix(nrow = 3, ncol = 3))
names(output[[i]]) <- names(df1)
}
output <- setNames(output, stored_df_name)
> rbindlist(output[1])
name age achivements
1: NA NA NA
2: NA NA NA
3: NA NA NA
输出是一个长度为3的列表,每个组件都是一个数据帧。您可以使用data.table包中的rbindlist函数将每个或所有组件转换为单个或行绑定的数据帧。带有for循环,并且OP尝试的更改最小:
for(name in stored_df_name){
empty_df = data.frame(matrix(nrow=3, ncol=3))
names(empty_df) <- names(df1)
assign(name, empty_df)
}
使用for循环和OP尝试的最小更改:
for(name in stored_df_name){
empty_df = data.frame(matrix(nrow=3, ncol=3))
names(empty_df) <- names(df1)
assign(name, empty_df)
}
到目前为止,Rui Barrada的答案似乎是创建dfs最有效的方法 我这样做更像是复制品 df1=data.framename=cx,y,m, 年龄=25,28,31, 成就=c0,1,1 存储的\u df\u name=caa、bb、cc 用_表示_loop1或长度为0的行。名称 > >bb美元 >[1]姓名年龄成就 >或0长度的行名称 > >$cc >[1]姓名年龄成就 >或0长度的行名称 用_表示_loop2或长度为0的行。名称 > >bb美元 >[1]姓名年龄成就 >或0长度的行名称 > >$cc >[1]姓名年龄成就 >或0长度的行名称 用_表示_loop3 1 NA NA NA >2娜娜娜娜 >3娜娜娜娜 > >bb美元 >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 > >$cc >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 与_lapply1 1 NA NA NA >2娜娜娜娜 >3娜娜娜娜 > >bb美元 >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 > >$cc >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 使用_lapply2或0长度的行名称 > >bb美元 >[1]姓名年龄成就 >或0长度的行名称 > >$cc >[1]姓名年龄成就 >或0长度的行名称 使用_lapply3或0长度的行名称 > >bb美元 >[1]姓名年龄成就 >或0长度的行名称 > >$cc >[1]姓名年龄成就 >或0长度的行名称 带_purr1[[1]] >[1]姓名年龄成就 >或0长度的行名称 > > [[2]] >[1]姓名年龄成就 >或0长度的行名称 > > [[3]] >[1]姓名年龄成就 >或0长度的行名称 带_purr2[[1]] >[1]姓名年龄成就 >或0长度的行名称 > > [[2]] >[1]姓名年龄成就 >或0长度的行名称 > > [[3]] >[1]姓名年龄成就 >或0长度的行名称 带_purr3[[1]] >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 > > [[2]] >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 > > [[3]] >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 tictoc::tic 基准测试 用_表示_loop1=用_表示_loop1, 用_表示_loop2=用_表示_loop2, 用_表示_loop3=用_表示_loop3, 带_lapply1=带_lapply3, 带_-lapply2=带_-lapply2, 带_lapply3=带_lapply1, 带\u purr1=带\u purr1, 带_purr2=带_purr2, 带\u purr3=带\u purr3, 次=100000 ->a toc::toc >84.444秒过去了 A. >基准概要: >时间单位:微秒 >expr n.eval min lw.qu中值平均值up.qu最大总相对误差 >带_环1 1e+05 69.7 82.8 88.6 93.8 96.0 39500 9380000 1.52 >带有用于环路的环路1e+05 47.2 54.9 58.2 62.0 62.9 39900 6200000 1.00 >带有用于环路的环路1e+05 46.9 54.8 58.3 61.7 63.1 43600 6170000 1.00 >带_lapply1 1e+05 70.2 85.1 91.4 97.2 98.4 53300 9720000 1.57 >带_lapply2 1e+05 48.1 57.2 61.2 64.6 66.2 4920 6460000 1.05 >带_lapply3 1e+05 48.0 57.1 61.2 64.4 66.3 5420 6440000 1.05 >带_purr1 1e+05 110.0 138.0 146.0 153.0 154.0 43500 153000002.50 > 带_purr2 1e+05 87.2 108.0 117.0 121.0 126.0 5920 121000002.01 >带_purr3 1e+05 85.8 108.0 117.0 121.0 126.0 6300 121000002.01 选项benchr.use\u ggplot=TRUE boxplota+ggplot2::theme_classic
到目前为止,Rui Barrada答案似乎是创建dfs最有效的方法 我这样做更像是复制品 df1=data.framename=cx,y,m, 年龄=25,28,31, 成就=c0,1,1 存储的\u df\u name=caa、bb、cc 用_表示_loop1或长度为0的行。名称 > >bb美元 >[1]姓名年龄成就 >或0长度的行名称 > >$cc >[1]姓名年龄成就 >或0长度的行名称 用_表示_loop2或长度为0的行。名称 > >bb美元 >[1]姓名年龄成就 >或0长度的行名称 > >$cc >[1]姓名年龄成就 >或0长度的行名称 用_表示_loop3 1 NA NA NA >2娜娜娜娜 >3娜娜娜娜 > >bb美元 >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 > >$cc >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 与_lapply1 1 NA NA NA >2娜娜娜娜 >3娜娜娜娜 > >bb美元 >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 > >$cc >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 使用_lapply2或0长度的行名称 > >bb美元 >[1]姓名年龄成就 >或0长度的行名称 > >$cc >[1]姓名年龄成就 >或0长度的行名称 使用_lapply3或0长度的行名称 > >bb美元 >[1]姓名年龄成就 >或0长度的行名称 > >$cc >[1]姓名年龄成就 >或0长度的行名称 带_purr1[[1]] >[1]姓名年龄成就 >或0长度的行名称 > > [[2]] >[1]姓名年龄成就 >或0长度的行名称 > > [[3]] >[1]姓名年龄成就 >或0长度的行名称 带_purr2[[1]] >[1]姓名年龄成就 >或0长度的行名称 > > [[2]] >[1]姓名年龄成就 >或0长度的行名称 > > [[3]] >[1]姓名年龄成就 >或0长度的行名称 带_purr3[[1]] >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 > > [[2]] >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 > > [[3]] >姓名年龄成就 >1NA NA NA >2娜娜娜娜 >3娜娜娜娜 tictoc::tic 基准测试 用_表示_loop1=用_表示_loop1, 用_表示_loop2=用_表示_loop2, 用_表示_loop3=用_表示_loop3, 带_lapply1=带_lapply3, 带_-lapply2=带_-lapply2, 带_lapply3=带_lapply1, 带\u purr1=带\u purr1, 带_purr2=带_purr2, 带\u purr3=带\u purr3, 次=100000 ->a toc::toc >84.444秒过去了 A. >基准概要: >时间单位:微秒 >expr n.eval min lw.qu中值平均值up.qu最大总相对误差 >带_环1 1e+05 69.7 82.8 88.6 93.8 96.0 39500 9380000 1.52 >带有用于环路的环路1e+05 47.2 54.9 58.2 62.0 62.9 39900 6200000 1.00 >带有用于环路的环路1e+05 46.9 54.8 58.3 61.7 63.1 43600 6170000 1.00 >带_lapply1 1e+05 70.2 85.1 91.4 97.2 98.4 53300 9720000 1.57 >带_lapply2 1e+05 48.1 57.2 61.2 64.6 66.2 4920 6460000 1.05 >带_lapply3 1e+05 48.0 57.1 61.2 64.4 66.3 5420 6440000 1.05 >带_purr1 1e+05 110.0 138.0 146.0 153.0 154.0 43500 153000002.50 >带_purr2 1e+05 87.2 108.0 117.0 121.0 126.0 5920 121000002.01 >带_purr3 1e+05 85.8 108.0 117.0 121.0 126.0 6300 121000002.01 选项benchr.use\u ggplot=TRUE boxplota+ggplot2::theme_classic
2021-04-02由v0.3.0创建,您正在覆盖for循环中的i。我想你应该像purrr一样,把它矢量化而不产生副作用。但是在您的代码中,您可以在覆盖for循环中的i的for循环mydfs之前创建一个空列表。我想你应该像purrr一样,把它矢量化而不产生副作用。但是在代码中,可以在for循环mydfs之前创建一个空列表