我正在处理从微观数据生成的巨大的.txt数据帧。每个.txt输出文件的大小约为3到4 GB!我有几百个....
对于每个怪物文件,它都有数百个功能,其中一些是分类的,而某些则是数字的。
这是数据框的抽象示例:
df <- read.csv("output.txt", sep="\t", skip = 9,header=TRUE, fill = T)
df
Row Column stimulation Compound Concentration treatmentsum Pid_treatmentsum var1 var2 var3 ...
1 1 uns Drug1 3 uns_Drug1_3 Jack_uns_Drug1_3 15.0 20.2 3.568 ...
1 1 uns Drug1 3 uns_Drug1_3 Jack_uns_Drug1_3 55.0 0.20 9.068
1 1 uns Drug2 5 uns_Drug2_5 Jack_uns_Drug2_5 100 50.2 3.568
1 1 uns Drug2 5 uns_Drug2_5 Jack_uns_Drug2_5 75.0 60.2 13.68
1 1 3S Drug1 3 3s_Drug3_3 Jack_3s_Drug1_3 65.0 30.8 6.58
1 1 4S Drug1 3 4s_Drug3_3 Jack_4s_Drug1_3 35.0 69.3 2.98
.....
我想基于分类列中的公共值(处理总和)拆分数据帧。 因此,我可以将所有用相同药物和相同剂量处理过的细胞放在一起,也就是所有“ uns_Drug1_3”都进入一个output.txt。
我看过类似的文章,所以我使用了split()
sptdf <- split(df, df$treatmentsum)
它起作用了,因为现在sptdf给了我数据帧列表。现在,我想将它们写成表,理想情况下,我想使用“ Pid_treatmentsum”元素作为每个分割文件的名称,因为它们在分割后应具有完全相同的“ Pid_treatmentsum”。我不太清楚该怎么做,到目前为止,我至少可以手动输入患者ID并通过粘贴将其加入
lapply(names(sptdf), function(x){write.table(sptdf[[x]], file = paste("Jack", x, sep = "_"))})
从某种意义上说,它可以写出所有具有正确标题的单个文件,但它们不是.txt,如果我在excel中打开它们,则会收到警告消息,指出它们已损坏。同时在R中,我收到警告消息
file(file,ifelse(append,“ a”,“ w”))中的错误:
无法打开连接
我在哪里弄错了?
考虑到显微镜的每个输出文件的绝对大小(3-4GB),这是最好的方法吗?
如果我可以进一步推广,是否可以将所有数百个大文件转储到一个文件夹中,是否可以编写一个循环来自动执行该过程,而不是一次拆分一个文件?我预见到的唯一问题是显微镜输出文件始终具有相同的名称,称为“输出”。
在此先感谢您,很长的帖子。
干杯, ML
答案 0 :(得分:0)
我不认为这与OP的代码有很大不同,但是就可以了。
首先,测试数据集。我将使用内置数据集iris
df <- iris
names(df)[5] <- "Pid_treatmentsum"
现在文件写入代码。
sptdf <- split(df, df$Pid_treatmentsum)
lapply(sptdf, function(DF){
outfile <- as.character(unique(DF[["Pid_treatmentsum"]]))
outfile <- paste0(outfile, ".txt")
write.table(DF,
file = outfile,
row.names = FALSE,
quote = FALSE)
})
如果Excel抱怨文件已损坏,也许write.csv
(和文件扩展名"csv"
)将解决问题。
要使上面的代码自动化以处理许多文件,可以将split/lapply
重写为一个函数。然后调用该函数,将文件名作为参数传递。
(未经测试)
splitFun <- function(file, col = "Pid_treatmentsum", ...){
X <- read.table(file, header = TRUE, ...)
sptdf <- split(X, X[[col]])
lapply(sptdf, function(DF){
outfile <- as.character(unique(DF[[col]]))
outfile <- paste0(outfile, ".txt")
write.table(DF,
file = outfile,
row.names = FALSE,
quote = FALSE)
})
}
filenames <- list.files(pattern = "<a regular expression>")
lapply(filenames, splitFun)