我有大量的文件都是编号并且是从CTD演员中标记的。这些文件都包含3列,用于烧制瓶号,深度和电导率,以及3行,每个烧瓶用一个水瓶。
1,68.93,0.2123
2,14.28,0.3139
3,8.683,0.3547
这些文件以演员编号命名," OS1505xxx.csv",其中xxx是演员编号。我想从多个演员表中获取数据,使用演员编号标记数据(我假设每个瓶子样本将在另一列中进行标记),然后将这些数据合并到一个数据帧中。
1,68.93,0.2123,001
2,14.28,0.3139,001
3,8.683,0.3547,001
1,109.5,0.2062,002
2,27.98,0.4842,002
3,5.277,0.3705,002
另外一件事,一些文件只有1或2瓶被烧,而其他文件也有4瓶被开除。我尝试查找只有3行的文件,并重复三次重复文件名列表,然后将其与三行中绑定的csv文件合并到一个数据帧中,但我对R很新,并且无法理解它出。任何帮助表示赞赏。
答案 0 :(得分:0)
试试这个:
files <- list.files(pattern="OS1505")
lst <- lapply(files, read.csv)
ids <- substr(files, 7,9)
for(i in 1:length(lst)) lst[[i]][,4] <- ids[i]
do.call(rbind, lst)
# X V1 V2 V3
#1 1 1 68.930 001
#2 2 2 14.280 001
#3 3 3 8.683 001
#4 1 1 109.500 002
#5 2 2 27.980 002
#6 3 3 5.277 002
我们首先创建两个虚拟文件,尝试将它们保存为csv文件进行测试。我以一种匹配你文件的方式命名它们。 (即&#34; OS1505001.csv&#34;):
file1 <- read.table(text="
1,68.93,0.2123
2,14.28,0.3139
3,8.683,0.3547", sep=',')
file2 <- read.table(text="
1,109.5,0.2062
2,27.98,0.4842
3,5.277,0.3705", sep=',')
write.csv(file1, "OS1505001.csv")
write.csv(file2, "OS1505002.csv")
通过代码,files
检查目录中是否有OS1505
个文件。有两个文件与该说明"OS1505001.csv" "OS1505002.csv"
匹配。我们将这两个文件带到read.csv
的R中。它包含在lapply
中,以便该过程可以立即发生在files
向量中的所有文件中,并保存在名为lst
的列表中。现在ids
是一种从文件名中获取id号的方法。在for循环中,我们将每个id分配给数据帧的第4列。最后,do.call
将所有内容与rbind
函数结合在一起。
答案 1 :(得分:0)
这将按顺序(001-100)将它们全部放入一个数据框中,然后您可以根据需要将其导出。
df <- data.frame(matrix(ncol = 4, nrow = 1))
colnames(df) <- c("V1", "V2", "V3", "file")
for(i in 1:100) {
file_name <- paste("OS1505",as.name(sprintf("%03d", i)),".csv",sep="")
if(file.exists(file_name)) {
print("match found")
df_tmp <- read.csv(file_name, header = FALSE, sep = ",",fill = TRUE)
df_tmp$file <- sprintf("%03d", i)
df <- rbind(df, df_tmp)
}
}