根据列拆分数据帧,并用特定名称写出多个拆分的.txt文件

时间:2020-02-18 17:23:17

标签: r dataframe split

我正在处理从微观数据生成的巨大的.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

1 个答案:

答案 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)