这个问题涉及到几个问题:
- 如何一次读取大量csv文件,
- 如何从 2 个格式正确的整数输入向量创建文件名向量。
第1项之前已经被问过很多次了,也是Parfait's answer的核心。
此答案侧重于第 2 项。
作为增加的复杂性,文件名遵循"09_06.csv"、"10_01.csv"(包括文件扩展名)的方案,而生成的 data.frames 将命名为"S09_06"、"S10_01"(带有前导@987654329 @ 但没有文件扩展名)。
使用outer() 和sprintf() 可以简化以适当格式创建基本名称(不带前缀和文件扩展名):
SID = c(9, 10)
S = 1:6
outer(SID, S, sprintf, fmt = "%02i_%02i")
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "09_01" "09_02" "09_03" "09_04" "09_05" "09_06"
[2,] "10_01" "10_02" "10_03" "10_04" "10_05" "10_06"
转换说明符 %02i 表示字段宽度为 2 个字符,输出将用前导 0s 填充。
现在,data.frames 列表可以通过 3 行代码创建:
basenames <- outer(SID, S, sprintf, fmt = "%02i_%02i")
df_list <- lapply(paste0(basenames, ".csv"), read.csv, header = TRUE, sep = ",")
names(df_list) <- paste0("S", basenames)
只是为了演示并且为了避免事先创建很多csv文件,使用print()函数代替read.csv():
basenames <- outer(SID, S, sprintf, fmt = "%02i_%02i")
df_list <- lapply(paste0(basenames, ".csv"), print) # just for demonstration
names(df_list) <- paste0("S", basenames)
df_list
$S09_01
[1] "09_01.csv"
$S10_01
[1] "10_01.csv"
$S09_02
[1] "09_02.csv"
$S10_02
[1] "10_02.csv"
$S09_03
[1] "09_03.csv"
$S10_03
[1] "10_03.csv"
$S09_04
[1] "09_04.csv"
$S10_04
[1] "10_04.csv"
$S09_05
[1] "09_05.csv"
$S10_05
[1] "10_05.csv"
$S09_06
[1] "09_06.csv"
$S10_06
[1] "10_06.csv"
创建一个 data.frame
OP 有mentioned,他想“选择必要的列,替换一些值”。这听起来好像所有文件都具有相同的结构,即相同的数量、顺序、名称和列类型。
如果所有文件都具有相同的结构,我会将它们组合在 一个 大型 data.frame 中。这比对 data.frames 列表应用所有操作更容易处理。
这就是我会用我喜欢的工具做的事情:
library(data.table)
library(magrittr)
SID = c(9, 10)
S = 1:6
filenames <-CJ(SID, S)[, sprintf("%02i_%02i.csv", SID, S)]
lapply(filenames, fread) %>%
set_names(filenames) %>%
rbindlist(idcol = "file")
file V1 V2 V3
1: 09_01.csv Y 39 -0.83562861
2: 09_01.csv D 1 1.59528080
3: 09_02.csv V 74 1.51178117
4: 09_02.csv N 7 0.38984324
5: 09_03.csv O 84 0.59390132
6: 09_03.csv A 35 0.91897737
7: 09_04.csv F 40 -1.47075238
8: 09_04.csv Y 44 -0.47815006
9: 09_05.csv B 18 -0.41499456
10: 09_05.csv M 22 -0.39428995
11: 09_06.csv G 81 -1.16657055
12: 09_06.csv K 13 -1.06559058
13: 10_01.csv N 59 0.48742905
14: 10_01.csv R 51 0.73832471
15: 10_02.csv I 37 -0.04493361
16: 10_02.csv Y 34 -0.01619026
17: 10_03.csv O 28 -1.98935170
18: 10_03.csv T 20 0.61982575
19: 10_04.csv Z 51 -0.10278773
20: 10_04.csv G 42 0.38767161
21: 10_05.csv S 70 0.76317575
22: 10_05.csv H 87 -0.16452360
23: 10_06.csv W 84 -0.11234621
24: 10_06.csv N 29 0.88110773
file V1 V2 V3
请注意,第一列包含该行的来源文件名。
数据
示例文件由
创建
library(data.table)
library(magrittr)
SID = c(9, 10)
S = 1:6
fn <- outer(SID, S, sprintf, fmt = "%02i_%02i.csv")
set.seed(1L)
nr = 2L
dfl <- replicate(
length(SID)*length(S),
data.frame(V1 = sample(LETTERS, nr), V2 = sample.int(100, nr), V3 = rnorm(nr)),
simplify = FALSE
) %>%
set_names(fn)
lapply(fn, function(x) fwrite(dfl[[x]], file = x))