基于分类变量依次计算R数据框架值的变化



我已经为天气预测构建了一组指标,我想通过在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,并根据上下信号的第一个和最后一个实例计算差异。例如,将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

最新更新