使用d_ply编写多个自定义文件

时间:2012-01-24 22:56:01

标签: r plyr

这个问题几乎与previous question相同,但差异很大,以至于该问题的答案在这里不起作用。就像上一个问题中的@chase一样,我想以下列格式(自定义fasta)为数据帧的每个分割写出多个文件。

#same df as last question

df <- data.frame(
    var1 = sample(1:10, 6, replace = TRUE)
    , var2 = sample(LETTERS[1:2], 6, replace = TRUE)
    , theday = c(1,1,2,2,3,3)
)    

#how I want the data to look
write(paste(">", df$var1,"_", df$var2, "\n", df$theday, sep=""), file="test.txt")

#whole df output looks like this:
#test.txt
>1_A 
1
>8_A
1
>4_A 
2
>9_A 
2
>2_A 
3
>1_A 
3

但是,我不想从整个数据帧中获取输出,而是为每个数据子集生成单独的文件。使用d_ply如下:

d_ply(df, .(theday), function(x) write(paste(">", df$var1,"_", df$var2, "\n", df$theday, sep=""), file=paste(x$theday,".fasta",sep="")))

我收到以下输出错误:

Error in file(file, ifelse(append, "a", "w")) : 
  invalid 'description' argument
In addition: Warning messages:
1: In if (file == "") file <- stdout() else if (substring(file, 1L,  :
  the condition has length > 1 and only the first element will be used
2: In if (substring(file, 1L, 1L) == "|") { :
  the condition has length > 1 and only the first element will be used

有关如何解决这个问题的任何建议吗?

谢谢, zachcp

1 个答案:

答案 0 :(得分:3)

您的代码存在两个问题。

  • 首先,在构建文件名时,您将向量x$theday传递给paste()。由于x$theday取自data.frame的一列,因此它通常包含多个元素。当您将多个文件名传递给其write()参数时,您看到的错误是file=抱怨。使用unique(x$theday)代替确保您只会将单个文件名粘贴在一起而不是多个文件名。

  • 其次,你没有看到它,但你可能想写x(data.frame的当前子集)的内容,而不是整个内容每个文件df

这是更正后的代码,看起来效果很好。

d_ply(df, .(theday), 
    function(x) {write(paste(">", x$var1,"_", x$var2, "\n", x$theday, sep=""), 
                       file=paste(unique(x$theday),".fasta",sep=""))
    })