R - Сгруппированные данные с изменением DoD - PullRequest
0 голосов
/ 22 мая 2018

Скажем, у меня есть необработанный набор данных (уже во фрейме данных, и я могу легко преобразовать его в xts.data.table с помощью as.xts.data.table), DF выглядит следующим образом:

Date | City | State | Country | DailyMinTemperature | DailyMaxTemperature | DailyMedianTemperature
-------------------------
2018-02-03 | New York City | NY | US | 18 | 22 | 19
2018-02-03 | London | LDN |UK | 10 | 25 | 15
2018-02-03 | Singapore | SG | SG | 28 | 32 | 29
2018-02-02 | New York City | NY | US | 12 | 30 | 18
2018-02-02 | London | LDN | UK | 12 | 15 | 14
2018-02-02 | Singapore | SG | SG | 27 | 31 | 30

и т. Д. (Еще много городов и много дней).

И я хотел бы сделать это, чтобы показать как текущую дневную температуру, так и дневное изменение дня по сравнению с предыдущим днем, вместе с другимиинформация о городе (штат, страна).т.е. новый фрейм данных должен быть примерно таким (из приведенного выше примера):

Date | City | State | Country | DailyMinTemperature | DailyMaxTemperature | DailyMedianTemperature| ChangeInDailyMin | ChangeInDailyMax | ChangeInDailyMedian
-------------------------
2018-02-03 | New York City | NY | US | 18 | 22 | 19 | 6 | -8 | 1
2018-02-03 | London | LDN |UK | 10 | 25 | 15 | -2 | -10 | 1
2018-02-03 | Singapore | SG | SG | 28 | 32 | 29 | 1 | 1 | -1
2018-02-03 | New York City | NY | US | ...

и так далее.т. е. добавьте еще 3 столбца, чтобы отобразить изменение дня за днем.

Обратите внимание, что в кадре данных у меня может не быть данных каждый день, однако мое изменение определяется как разница между температурой в день t - температурой в большинственедавняя дата, когда у меня есть данные о температуре.

Я пытался использовать функцию сдвига, но R жаловался на знак: =.

Есть ли какой-нибудь способ в RI заставить это работать?

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете использовать пакеты dplyr::mutate_at и lubridate для преобразования данных в желаемый формат.Данные должны быть упорядочены в формате даты, и разница текущей записи с предыдущей записью может быть получена с помощью функции dplyr::lag.

library(dplyr)
library(lubridate)

df %>% mutate_if(is.character, funs(trimws)) %>%  #Trim any blank spaces
  mutate(Date = ymd(Date)) %>%                    #Convert to Date/Time
  group_by(City, State, Country) %>%               
  arrange(City, State, Country, Date) %>%         #Order data date
  mutate_at(vars(starts_with("Daily")), funs(Change = . - lag(.))) %>%
  filter(!is.na(DailyMinTemperature_Change))

Результат:

# # A tibble: 3 x 10
# # Groups: City, State, Country [3]
# Date       City          State Country DailyMinTemperature DailyMaxTemperature DailyMedianTemperature DailyMinTemperature_Change DailyMaxT~ DailyMed~
#   <date>     <chr>         <chr> <chr>                 <dbl>               <dbl>                  <int>                      <dbl>      <dbl>     <int>
# 1 2018-02-03 London        LDN   UK                     10.0                25.0                     15                      -2.00      10.0          1
# 2 2018-02-03 New York City NY    US                     18.0                22.0                     19                       6.00     - 8.00         1
# 3 2018-02-03 Singapore     SG    SG                     28.0                32.0                     29                       1.00       1.00        -1
# 

Данные:

df <- read.table(text = 
"Date | City | State | Country | DailyMinTemperature | DailyMaxTemperature | DailyMedianTemperature
2018-02-03 | New York City | NY | US | 18 | 22 | 19
2018-02-03 | London | LDN |UK | 10 | 25 | 15
2018-02-03 | Singapore | SG | SG | 28 | 32 | 29
2018-02-02 | New York City | NY | US | 12 | 30 | 18
2018-02-02 | London | LDN | UK | 12 | 15 | 14
2018-02-02 | Singapore | SG | SG | 27 | 31 | 30",
header = TRUE, stringsAsFactors = FALSE, sep = "|")
...