我有一个快速格式化问题。我在数据框中有一组数据,如下所示:
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>
显然,我的真实数据有数以万计的条目,否则我可以手工完成。任何建议都会很棒。谢谢。
答案 0 :(得分: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>
列以制表符分隔。
答案 1 :(得分: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>