2014-01-20 2 views
0

У меня есть быстрый вопрос форматирования. У меня есть набор данных в кадре данных, который выглядит следующим образом:Форматирование в текстовый файл в R

Animal Food Food ID 
dog  steak 100 
dog  beef 200 
dog  poo  001 
cat  milk 020 
cat  steak 100 
cat  beef 200 

, который, для ввода программирования целей, мне нужно преобразовать в файл «.txt» с форматом, как это:

<dog> 
steak 100 
beef 200 
poo  001 
</dog> 

<cat>  
milk 020 
steak 100 
beef 200 
</cat> 

Очевидно, что у моих реальных данных есть десятки тысяч записей, иначе я мог бы это сделать вручную. Любые предложения были бы замечательными. Благодарю.

ответ

1

Вот способ:

# create the string 
text <- paste0(sapply(unique(dat$Animal), function(x) { 
    subdat <- dat[dat$Animal == x, -1] 
    subdat[[2]] <- sprintf("%03d", subdat[[2]]) 
    paste0("<", x, ">\n", 
     paste(capture.output(write.table(subdat, sep = "\t", 
              quote = FALSE, row.names = FALSE, 
              col.names = FALSE)), collapse = "\n"), 
     "\n</", x, ">") 
}), collapse = "\n\n") 

# write it to a file 
write(text, file = "filename.txt") 

Результирующий файл:

<dog> 
steak 100 
beef 200 
poo 001 
</dog> 

<cat> 
milk 020 
steak 100 
beef 200 
</cat> 

Столбцы разделителями табуляции.

+0

Отлично! Большое спасибо. –

0

Этот подход использует функцию d_ply для разделения животных перед обработкой. Обратите внимание, что разделитель по умолчанию (пробела) может быть изменен.

Записывать ли когда-либо документы? Например, если dog имеет две строки для steak, следует ли их каким-то образом объединить? Если это так, подход plyr должен быть в состоянии принять это, с небольшими изменениями.

ProcessAnimal <- function(d, fileLocation, delimiter=" ") { 
    cat(paste0("<", d$Animal[1], ">\n"), file=fileLocation, append=TRUE, sep="") 

    cat(sapply(seq_len(nrow(ds)), function(i) { 
    paste0(paste0(ds[i, c("Food", "FoodID")], collapse=delimiter), sep="\n") 
    }), file=fileLocation, append=TRUE, sep="") 

    cat(paste0("</", d$Animal[1], ">\n"), file=fileLocation, append=TRUE, sep="") 
} 

plyr::d_ply(.data=ds, .variables="Animal", .fun=ProcessAnimal, fileLocation="PetFood.txt") 

Текстовый файл выглядит следующим образом:

<cat> 
steak 100 
beef 200 
poo 001 
milk 020 
steak 100 
beef 200 
</cat> 
<dog> 
steak 100 
beef 200 
poo 001 
milk 020 
steak 100 
beef 200 
</dog> 
Смежные вопросы