這裏的問題的例子數據,代碼和解釋:如何加快這個條件連接(for-loop很慢)?
require(data.table)
require(dplyr)
df1 <- read.table(text= "
col1 col2 col3 col4 col5
123 121 16519 1 4
123 121 16519 2 5
123 121 16518 3 5
123 121 16517 4 6
123 121 16512 5 7
123 121 16554 6 8
124 333 16554 7 9
124 333 16552 8 5
124 333 16549 1 1
124 333 16495 2 2
124 555 16573 4 4
125 555 16573 5 3
125 555 16569 6 5
125 555 16567 7 6
125 555 16568 8 7
", header=TRUE, na.strings=NA, stringsAsFactors=FALSE)
df2 <- distinct(df1[c("col1","col2","col3")])
setnames(df2, old=c("col1","col2","col3"), new=c("col11","col22","col33"))
res <- vector("list", nrow(df2))
for(i in 1:nrow(df2)) {
one_row <- df2[i,]
df <- merge(select(one_row, col11, col22, col33),
select(df1,col1,col2,col3,col4,col5),by=NULL)%>%
filter((col3 >= (col33-(7))) & (col3 < col33))
res[[i]] = df%>%
group_by(col11, col22,col33)%>%
summarise(Averagecol4=mean(col4,na.rm=TRUE), Count=n())
}
as.data.frame(do.call("rbind", res))
# col11 col22 col33 Averagecol4 Count
# 1 123 121 16519 4.0 3
# 2 123 121 16518 4.5 2
# 3 123 121 16517 5.0 1
# 4 123 121 16554 4.5 2
# 5 124 333 16554 4.5 2
# 6 124 333 16552 1.0 1
# 7 124 555 16573 7.0 3
# 8 125 555 16573 7.0 3
# 9 125 555 16569 7.5 2
# 10 125 555 16568 7.0 1
- 的代碼創建一個
data.frame
。 - 然後通過考慮三列
- 的僅不同(或獨特)組合然後重命名DF2的列名創建另一個
data.frame
從它。 - 創建一個空列表
res
,並且對於df2
中的每一行,執行與df1
的加入,然後執行條件過濾,將結果聚合並存儲在對應索引res
中。 rbind
結果最終得到data.frame
。
問題是,對於nrow(df1) = ~225,000
,這需要很多時間。我如何加快速度?
您的代碼錯誤現在出來。 'setnames'來自哪裏?它是不同版本的'setNames'嗎? – alistaire
@alistaire感謝您指出。它的固定! – KGarg
現在仍在出錯,因爲'res'沒有結束爲data.frame。更好的問題:你想要的輸出是什麼? – alistaire