2012-01-24 3 views
0

Этот вопрос почти такой же, как у previous question, но он достаточно отличается, что ответы на этот вопрос здесь не сработают. Как и @chase в последнем вопросе, я хочу выписать несколько файлов для каждого раскола в dataframe в следующем формате (custom fasta).написать несколько пользовательских файлов с помощью d_ply

#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 

Однако, вместо того, чтобы выход из всего dataframe Я хочу, чтобы генерировать отдельные файлы для каждого подмножества данных. Использование 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

ответ

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="")) 
    }) 
+0

быстрый и удивительный. – zach

+0

@zach - Спасибо. Я сразу же поместил вызов 'browser()' в тело анонимной функции (т. Е. 'Function (x) {browser(), write .....}'), что упрощает отладку. Делая это, вы можете осмотреться и изучить каждую часть окружающей среды и вычисления на досуге, и можете быстро увидеть, что пошло не так. –

+0

хороший наконечник! благодаря – zach

 Смежные вопросы

  • Нет связанных вопросов^_^