0

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

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>

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

4

2 回答 2

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>

列是制表符分隔的。

于 2014-01-20T20:22:20.350 回答
0

这种方法使用该d_ply功能在处理之前将动物分开。请注意,可以更改(空格的)默认分隔符。

记录是否需要折叠?例如,如果dog有两行 for 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>
于 2014-01-20T20:41:02.233 回答