[英]Optimizing preprocessing data frame in R
我有以下名為dataValues
數據框:
dates hours
1 2015-10-12 1
5 2015-10-12 5
9 2015-10-12 9
11 2015-10-12 11
14 2015-10-12 14
15 2015-10-12 15
17 2015-10-12 17
19 2015-10-12 19
22 2015-10-12 22
23 2015-10-12 23
24 2015-10-12 24
27 2015-10-13 3
29 2015-10-13 5
33 2015-10-13 9
36 2015-10-13 12
37 2015-10-13 13
38 2015-10-13 14
40 2015-10-13 16
42 2015-10-13 18
44 2015-10-13 20
45 2015-10-13 21
46 2015-10-13 22
47 2015-10-13 23
49 2015-10-14 1
54 2015-10-14 6
56 2015-10-14 8
59 2015-10-14 11
60 2015-10-14 12
61 2015-10-14 13
63 2015-10-14 15
64 2015-10-14 16
66 2015-10-14 18
69 2015-10-14 21
71 2015-10-14 23
72 2015-10-14 24
我已經對該數據框進行了預處理,以獲取某天的所有時間,這是變量totallist並具有輸出:
[[1]
[1] 1 5 9 11 14 15 17 19 22 23 24
[[2]
[1] 3 5 9 12 13 14 16 18 20 21 22 23
[[3]
[1] 1 6 8 11 12 13 15 16 18 21 23 24
我用於此的代碼如下:
uniqueDates <- unique(dataValues$dates)
totallist <- {}
for(date in uniqueDates){
templist <- {}
for(i in 1:length(dataValues$dates)){
if(dataValues$dates[i]==date){
newlist <- append(templist,dataValues$hours[i])
}
}
totallist <- append(totallist,list(templist))
}
對於此問題中的示例(3天),它可以正常工作,結果是我想要的,但是如果我在大型數據集(大約260天)中使用它,則大約需要6到7分鍾才能完成。
我的問題是,是否有一種優化的方法來做我想做的事?
嘗試以下任何一種方法:
# 1
with(unique(dataValues), split(hours, dates))
# 1a - variation of last solution
with(dataValues, lapply(split(hours, dates), unique))
# 2
unstack(unique(dataValues), hours ~ dates)
# 2a - variation of last solution
lapply(unstack(dataValues, hours ~ dates), unique)
請注意,如果已知數據值已經是unique(dataValues)
問題中所示的示例數據中的情況unique(dataValues)
,則#1和#2中的unique(dataValues)
可以僅替換為dataValues
。
我相信使用tapply函數會更好。 我創建了一個更簡單的數據框,以顯示其作用:
df <- data.frame(dates=rep(c("2015-01-02","2015-01-03","2015-01-04"),10),hours=trunc(runif(30,1,10)))
tapply(df$hours,df$dates,unique)
輸出:
$`2015-01-02`
[1] 2 8 6 1 5
$`2015-01-03`
[1] 7 5 2 3
$`2015-01-04`
[1] 1 2 6 5 8 4 9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.