如何用R语言循环将dataframe行批量写入多个目标dataframe指定位置
问题描述
我正在尝试编写R语言循环,将list_files dataframe中的每一行写入多个目标dataframe的指定位置。已为此困扰多日,恳请帮助!
list_files数据
0.364618 0.944114 0.274912 0.600096 1.718930 1.071100 1.733920 0.349970 0.885879 0.254805 0.592313 1.539530 0.913408 1.741790 0.311971 0.877417 0.244049 0.541382 1.469480 0.926704 1.622540 0.317075 0.917018 0.233637 0.548263 1.513830 0.959897 1.611970
目标dataframe
- df_fa
- df_md
- df_awf
- df_daxon
- df_de_axial
- df_de_radial
- df_de_tort
手动操作逻辑
写入[2,1]位置
df_fa[2,1]<-list_file[1,] df_md[2,1]<-list_file[2,] df_awf[2,1]<-list_file[3,] df_daxon[2,1]<-list_file[4,] df_de_axial[2,1]<-list_file[5,] df_de_radial[2,1]<-list_file[6,] df_de_tort[2,1]<-list_file[7,]
写入[2,2]位置
df_fa[2,2]<-list_file[8,] df_md[2,2]<-list_file[9,] df_awf[2,2]<-list_file[10,] df_daxon[2,2]<-list_file[11,] df_de_axial[2,2]<-list_file[12,] df_de_radial[2,2]<-list_file[13,] df_de_tort[2,2]<-list_file[14,]
写入[2,3]位置
df_fa[2,3]<-list_file[15,] df_md[2,3]<-list_file[16,] df_awf[2,3]<-list_file[17,] df_daxon[2,3]<-list_file[18,] df_de_axial[2,3]<-list_file[19,] df_de_radial[2,3]<-list_file[20,] df_de_tort[2,3]<-list_file[21,]
写入[2,4]位置
df_fa[2,4]<-list_file[22,] df_md[2,4]<-list_file[23,] df_awf[2,4]<-list_file[24,] df_daxon[2,4]<-list_file[25,] df_de_axial[2,4]<-list_file[26,] df_de_radial[2,4]<-list_file[27,] df_de_tort[2,4]<-list_file[28,]
手动编码工作量极大,希望通过循环实现该批量操作。
解决方案
可以通过以下两种方式实现批量赋值,避免重复编码:
方法一:用列表管理目标dataframe
# 1. 将所有目标dataframe存入列表 target_dfs <- list( fa = df_fa, md = df_md, awf = df_awf, daxon = df_daxon, de_axial = df_de_axial, de_radial = df_de_radial, de_tort = df_de_tort ) # 2. 按每7行拆分list_files,对应4列的赋值批次 batch_size <- 7 batches <- split(list_files, ceiling(seq(nrow(list_files))/batch_size)) # 3. 双层循环完成赋值 for (col_idx in 1:length(batches)) { current_batch <- batches[[col_idx]] for (df_idx in 1:length(target_dfs)) { target_dfs[[df_idx]][2, col_idx] <- current_batch[df_idx, ] } } # 4. 将修改后的dataframe同步回原变量 df_fa <- target_dfs$fa df_md <- target_dfs$md df_awf <- target_dfs$awf df_daxon <- target_dfs$daxon df_de_axial <- target_dfs$de_axial df_de_radial <- target_dfs$de_radial df_de_tort <- target_dfs$de_tort
方法二:直接通过变量名操作原dataframe
如果不想额外维护列表,可以用get和assign直接操作原变量:
# 定义目标dataframe的名称向量 target_names <- c("df_fa", "df_md", "df_awf", "df_daxon", "df_de_axial", "df_de_radial", "df_de_tort") batch_size <- 7 batches <- split(list_files, ceiling(seq(nrow(list_files))/batch_size)) # 循环赋值 for (col_idx in 1:length(batches)) { current_batch <- batches[[col_idx]] for (df_idx in 1:length(target_names)) { temp_df <- get(target_names[df_idx]) temp_df[2, col_idx] <- current_batch[df_idx, ] assign(target_names[df_idx], temp_df) } }
核心逻辑说明
- 两种方法都利用
split函数将list_files按7行一组拆分,自动匹配4列的赋值需求 - 内层循环通过索引对应,实现
list_files批次中的第N行,写入第N个目标dataframe的指定位置 - 方法一的列表管理更直观,方法二则省去了最后同步变量的步骤,可根据习惯选择
内容的提问来源于stack exchange,提问作者liliana wu
相关产品推荐
相关产品推荐

