2014-10-09 66 views
0

我有一個名爲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") 
} 
+1

什麼是'file = file =',應該只需要一個'file ='。但因爲大多數這些變量/函數沒有在您的示例代碼中定義,您的問題不是[重現性](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-例如),所以很難幫助你。 – MrFlick 2014-10-09 15:14:23

+0

抱歉,我粘貼時發生錯字。 – davids12 2014-10-09 15:18:20

+0

我得到的錯誤之一是這樣的:if(file ==「」)file < - stdout()else if(is.character(file)){: 缺少值,其中TRUE/FALSE需要 – davids12 2014-10-09 15:20:03

回答

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個成分列表東西的輸出在循環中迭代。所以現在你必須將它分成兩部分寫入你想要的文件中

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") 
+0

我喜歡這個方法,但運行時遇到錯誤:myresultsdf < - do.call(rbind,myresults),我得到的錯誤是match.names(clabs,names(xi))中的錯誤: 名稱不匹配以前的名稱 – davids12 2014-10-09 19:11:36

+0

這意味着ga $ getData返回的數據幀並不總是具有相同的列名。我已經改變了一下代碼,所以分裂發生在rbinding之前。所以如果ga $ getData返回相同的文件名對應相同的文件名的列名,它現在應該可以工作,否則我不能在沒有能夠重現的情況下幫忙... – konvas 2014-10-10 11:13:43

+0

非常感謝!偉大的工程 - 我會問你的唯一問題是我怎樣才能得到我傳遞給我的id包含在myresultslist中? – davids12 2014-10-10 13:41:00

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, ...)