2016-07-29 87 views
2

我有以下兩個數據幀。 df1由單個用戶的平均參數大小組成。 df2包含用戶的相同參數的平均每日值。根據條件比較兩個數據幀

我想要計算的事件天數df2$size > df1$size對於每個user

df1 = read.table(text='user size 
AAL0706 29000 
AAN0823 25000 
AAV0450 30000', stringsAsFactors=FALSE, header=TRUE) 


df2 = read.table(text='Date user size 
     2010-01-04 AAL0706 31054 
     2010-01-06 AAL0706 20703 
     2010-01-08 AAL0706 39968 
     2010-01-04 AAN0823 17892 
     2010-01-06 AAN0823 37839 
     2010-01-08 AAN0823 19649 
     2010-01-04 AAV0450 35432 
     2010-01-06 AAV0450 37839', stringsAsFactors=FALSE, header=TRUE) 

預期成果是:

user count 
AAL0706  2 
AAN0823  1 
AAV0450  2 

我曾嘗試使用下面的命令來計算我的結果,但我知道什麼是錯的。

lapply(df1, function(y) { 
    ddply(df2$size, .(user), function(x) { 
     return(length(y$size(y$size > x$size)) 
    }) 
}) 

您能否請教我一個這樣做的有效方法?

回答

1

我們可以做一個left_joindplyr,由 '用戶' 分組得到的邏輯指數(size.x > size.y

library(dplyr) 
left_join(df2, df1, by = "user") %>% 
      group_by(user) %>% 
      summarise(Count = sum(size.x > size.y)) 
#  user Count 
#  <chr> <int> 
#1 AAL0706  2 
#2 AAN0823  1 
#3 AAV0450  2 

或者使用data.table

library(data.table) 
setDT(df2)[df1, .(count = sum(size > i.size)),on = "user", by = .EACHI] 
#  user count 
#1: AAL0706  2 
#2: AAN0823  1 
#3: AAV0450  2 
+1

「dplyr」庫的使用有助於我替換大部分使用「聚合」函數進行的工作。處理大型數據集時,我正在用「聚合」函數解決內存問題。我相信「dplyr」包是我的問題的一個很好的選擇 – Anna

1

A的sum稍微簡單解決方案使用data.table將使用新的non-equi連接功能在c中可用urrent開發版data.table,v1.9.7。

require(data.table) 
setDT(df2)[df1, .N, on=.(user, size > size), by=.EACHI] 

df1的每行都針對基於提供給on參數的條件,即匹配的user精確值,尋找所有行的df2size是內更大df2所有行匹配那user

一旦獲得匹配行(針對每一行),將針對每行評估表達式.N(=匹配行的計數),因爲by = .EACHI意味着這一點。它指示執行提供給第二個參數j的表達式,以運行每個i(第一個參數)。

請參閱開發版here的安裝說明。