2016-09-06 61 views
0

問題: 我有兩個數據幀。 DF付款日誌:如何加速R中的循環代碼

Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 53682 obs. of 7 variables: 


str(moneyDB) 
$ user_id : num 59017170 57859746 58507536 59017667 59017795 ... 
$ reg_date: Date, format: "2016-08-06" "2016-07-01" "2016-07-19" ... 
$ date : Date, format: "2016-08-06" "2016-07-01" "2016-07-19" ... 
$ money : num 0.293 0.05 0.03 0.03 7 ... 
$ type : chr "1" "2" "2" "1" ... 
$ quality : chr "VG" "no_quality" "no_quality" "VG" ... 
$ geo  : chr "Canada" "NO GEO" "NO GEO" "Canada" ... 

下面是它的結構。它只是所有交易的記錄。

另外我有第二數據幀:

str(grPaysDB) 

Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 335591 obs. of 9 variables: 
$ reg_date  : Date, format: "2016-05-01" "2016-05-01" "2016-05-01" ... 
$ date   : Date, format: "2016-05-01" "2016-05-01" "2016-05-01" ... 
$ type   : chr "1" "1" "1" "1" ... 
$ quality  : chr "VG" "VG" "VG" "VG" ... 
$ geo   : chr "Australia" "Canada" "Finland" "Canada" ... 
$ uniqPayers : num 0 1 0 1 1 0 0 1 0 3 ... 

及其分組從第一數據幀+零個交易數據。例如,在第二個數據框中有零個付款人的行很多。這就是爲什麼第二個數據幀大於第一個。

我需要在第二個數據框中添加第列weeklyPayers列。每週付款人是過去7天內的唯一付款人。我試過通過循環做,但它太長了。有沒有其他矢量化的想法,如何實現這一點?

weeklyPayers <- vector() 
for (i in 1:nrow(grPaysDB)) { 
    temp <- moneyDB %>% 
     filter(
     geo == grPaysDB$geo[i], 
     reg_date == grPaysDB$reg_date[i], 
     quality == grPaysDB$quality[i], 
     type == grPaysDB$type[i], 
     between(date, grPaysDB$date[i] - 6, grPaysDB$date[i]) 
    ) 

    weeklyPayers <- c(weeklyPayers, length(unique(temp$user_id))) 
} 
grPaysDB <- cbind(grPaysDB, weeklyPayers) 

在該循環中在第二數據幀中的每一行i找到與右緣,類型,質量和reg_date和日期的範圍的第一數據幀的行。然後我可以計算唯一付款人的數量。

+3

最好爲示例使用內置數據集或通過'dput'共享您的數據 –

回答

0

我會嘗試在多列上使用merge對數據集進行加入(c('geo', 'reg_date', 'quality', 'type'),並根據日期篩選結果。之後,聚合使用summarise

但我不完全確定你爲什麼要爲每個交易添加weeklypayers。是不是更多的信息或更容易彙總您的數據周編號(與dplyr)。像這樣:

moneyDB %>% mutate(week = date- as.POSIXlt(date)$wday) %>% 
    group_by(geo, reg_date, quality, type, week) %>% 
    summarise(weeklyPayers = n()) 
0

我可能會誤解,但我認爲這應該相當簡單,在dplyr中使用過濾器和彙總。但是,正如@ Hack-R提到的那樣,獲取數據集將會很有幫助。但它看起來像這樣:

library(dplyr) 
weeklyPayers <- grPaysDB %>% 
    filter(date > ADD DATE IN QUESTION) %>% 
    summarise(sumWeeklyPayers = sum(uniqPayers)) 

然後,我可能會誤解。如果您的問題涉及每週總結,那麼您可能需要在timeSeries軟件包中調查daily2weekly,然後使用group_by查看每週發生的變量。