附加到循环中的文本文件

时间:2014-10-09 14:48:09

标签: r

我有一个名为MetricsInput的数据框,如下所示:

ID  ExtractName     Dimensions  Metrics     First_Ind
124 extract1.txt    ga:date     gs:sessions 1
128 extract1.txt    ga:date     gs:sessions 0
134 extract1.txt    ga:date     gs:sessions 0
124 extract2.txt    ga:browser  ga:users    1
128 extract2.txt    ga:browser  ga:users    0
134 extract2.txt    ga:browser  ga:users    0

我试图在循环中使用上面的数据框来运行一系列查询,最终将创建2个文本文件extract1.txt和extract2.txt。我有first_ind字段的原因是我只想在第一次运行每个唯一文件时附加列标题。

这是我的循环 - 我遇到的问题是每个ID的数据都没有附加 - 我似乎覆盖了我的结果,而不是附加。我哪里出错了?

for(i in seq(from=1, to=nrow(MetricsInput), by=1)){
  id <- MetricsInput[i,1]
  myresults <- ga$getData(id,batch = TRUE, start.date="2013-12-01", end.date="2014-01-01", metrics = MetricsInput[i,4], dimensions = MetricsInput[i,3])

  appendcolheads <- ifelse(MetricsInput[i,5]==1, TRUE, FALSE)

  write.table(myresults, file=MetricsInput$ExtractName[i], append=TRUE, row.names = FALSE, col.names = appendcolheads, sep="\t")
}

2 个答案:

答案 0 :(得分:1)

尽管您可以使用此代码,但它看起来并不是正确的方法。正如@MrFlick在评论中所说的那样,如果不能重现你的问题就很难提供帮助,但我会按照以下几点做点什么

GetData <- function(id, metric, dim) {
    d <- ga$getData(id, batch = TRUE, start.date="2013-12-01",
             end.date="2014-01-01", metrics = metric, dimensions = dim)
    d$id <- id
    d
}

myresults <- Map(GetData, 
                   id = MetricsInput$ID,
                   metric = MetricsInput$Metrics,
                   dim = MetricsInput$Dimensions)

这将为您提供一个列表,其第i个组件是for循环中第i个迭代的输出。所以现在你必须把它分成两部分才能把它写在你想要的文件中

myresultslist <- split(myresults, MetricsInput$ExtractName)
myresultslist <- lapply(myresultslist, do.call, what = rbind)

Map(write.table, x = myresultslist, file = names(myresultslist), 
    row.names = FALSE, sep = "\t")

答案 1 :(得分:0)

为什么不在循环中创建数据框,然后将其写入文本文件?

myresults <- data.frame()
for (i in yourloop) {
  #your code here
  id <- MetricsInput[i,1]
  temp <- ga$getData(id,batch = TRUE, start.date="2013-12-01", end.date="2014-01-01", metrics = MetricsInput[i,4], dimensions = MetricsInput[i,3])

  myresults <- rbind(myresults, temp)
}

write.csv(myresults, ...)