[英]Sequentially calculate changes in R data frame value based on categorical variables
我已經構建了一套天氣預報指標,我想通過在R中使用不同的指標集對我的算法進行回測。盡管我有一些使用數據表進行合並的經驗,但我無法找到一種方法來完成此特定任務。 這是我的一部分數據
Time TempC Index1 Index2 Index3 Index4
1 25.0 Up Down Down Down
2 25.2 Up Up Up Down
3 25.6 Up Up Up Up
4 25.0 Down Down Down Up
5 24.7 Down Down Down Down
6 23.6 Down Down Down Down
7 28.9 Up Up Up Down
8 30.0 Up Up Up Up
理想情況下,我會選擇一組指標,比如說Index1和Index2,並根據Up和Down信號的第一個和最后一個實例來計算差異。 例如,當使用Index1作為唯一預測變量時;
Time TempC TempDiff
1,3 25.0, 25.6 0.6
4,6 25.0, 23.6 1.4
7,8 28.9, 30.0 1.1
當同時使用Index1和Index2時;
Time TempC TempDiff
2,3 25.2, 25.6 0.4
4,6 25.0, 23.6 1.4
7,8 28.9, 30.0 1.1
對我來說最重要的是差異。 將開始和結束溫度和時間刻度與逗號連接是完全可選的。 任何幫助將不勝感激。
編輯
我也想知道是否有辦法忽略在兩個或多個索引的情況下不符合條件的中間值集,如下所示;
Time TempC Index1 Index2 Index3 Index4
1 25.0 Up Down Down Down
2 25.2 Up Up Up Down
3 25.6 Up Up Up Up
4 25.0 Down Down Down Up
5 24.7 Down Down Down Down
6 23.6 Down Down Down Down
7 28.9 Up Up Up Down
8 29.3 Up Down Down Down
9 30.0 Up Up Up Up
當同時使用Index1和Index2時,上面的期望結果將是忽略第8行,並通常計算與第7行和第9行的差。
最后,添加指示方向(上或下)的另一列將很有用,這樣我可以量化模型的可靠性
Time TempC TempDiff Direction
2,3 25.2, 25.6 0.4 Up
4,6 25.0, 23.6 -1.4 Down
7,8 28.9, 30.0 1.1 Up
使用dplyr和data.table的解決方案。
library(dplyr)
library(data.table)
dat2 <- dat %>%
# Create Run Length ID
mutate(ID = rleid(Index1)) %>%
group_by(ID) %>%
# Filter groups with n > 1
filter(n() > 1) %>%
# Summarise the data by first and last value of each group
summarise(Time = paste(first(Time), last(Time), sep = ", "),
TempRange = paste(first(TempC), last(TempC), sep = ", "),
TempDiff = abs(first(TempC) - last(TempC))) %>%
ungroup() %>%
select(-ID)
dat2
# # A tibble: 3 x 3
# Time TempRange TempDiff
# <chr> <chr> <dbl>
# 1 1, 3 25, 25.6 0.600
# 2 4, 6 25, 23.6 1.40
# 3 7, 8 28.9, 30 1.10
如果要考慮多個列,可以為rleid
函數提供多個列。
dat3 <- dat %>%
# Create Run Length ID
mutate(ID = rleid(Index1, Index2)) %>%
group_by(ID) %>%
# Filter groups with n > 1
filter(n() > 1) %>%
# Summarise the data by first and last value of each group
summarise(Time = paste(first(Time), last(Time), sep = ", "),
TempRange = paste(first(TempC), last(TempC), sep = ", "),
TempDiff = abs(first(TempC) - last(TempC))) %>%
ungroup() %>%
select(-ID)
dat3
# # A tibble: 3 x 3
# Time TempRange TempDiff
# <chr> <chr> <dbl>
# 1 2, 3 25.2, 25.6 0.400
# 2 4, 6 25, 23.6 1.40
# 3 7, 8 28.9, 30 1.10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.