Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在r中相同大小的循环中创建空数据帧,并为它们指定另一个数据帧的名称?_R_Dplyr - Fatal编程技术网

在r中相同大小的循环中创建空数据帧,并为它们指定另一个数据帧的名称?

在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")

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")
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之前创建一个空列表