格式化为R中的文本文件

时间:2014-01-20 19:57:03

标签: r text dataformat

我有一个快速格式化问题。我在数据框中有一组数据,如下所示:

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>

显然,我的真实数据有数以万计的条目,否则我可以手工完成。任何建议都会很棒。谢谢。

2 个答案:

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