Как я могу упростить код корреляции в R? - PullRequest
0 голосов
/ 30 мая 2020

Это мой df:

                  date                     z         x                    y 
   <dttm>                               <dbl>    <dbl>                <dbl> 
 1 2019-01-01 00:00:00                   1333  3339072.         456700000000 
 2 2019-02-01 00:00:00                    915  4567582.         904600000000 
 3 2019-03-01 00:00:00                   1433  7887962.         247900000000 
 4 2019-04-01 00:00:00                   1444  3454559.         905700000000 
 5 2019-05-01 00:00:00                   1231  9082390.         245600000000 
 6 2019-06-01 00:00:00                    346   781224.         346700000000 

Как я могу упростить этот код до l oop?

df %>%
filter(year(df$date) == 2017) %>%
mutate(correlation = cor(x, y))

df %>%
filter(year(df$date) == 2018) %>%
mutate(correlation = cor(x, y))

df %>%
filter(year(df$date) == 2019) %>%
mutate(correlation = cor(x, y))

df %>%
filter(year(df$date) == 2020) %>%
mutate(correlation = cor(x, y))

Это то, что я пробовал до сих пор, но я ' У нас есть несколько НА:

years <- c(2017, 2018, 2019, 2020)
for (y in years) {
  df %>%
    filter(date == y) %>%
    mutate(correlation = cor(x, y))
    print(df$correlation[y])
}

Мой желаемый результат будет примерно таким:

[1] 2017: 0.23
[1] 2018: -0.38
[1] 2019: 0.40
[1] 2020: 0.15

Ответы [ 2 ]

2 голосов
/ 30 мая 2020

Чтобы получить корреляцию по годам, вы можете захотеть превратить столбец dttm во что-то, что позволяет нам делать равенство по годам. Мы можем использовать для этого функцию года в lubridate, тогда код должен работать.

library(lubridate)

df$year <- year(df$date)

for (y in unique(df$year)){
  df %>%
    filter(year == y) %>%
    mutate(correlation = cor(x, y)) %>%
    print(unique(correlation))
}

В качестве альтернативы мы можем быть немного более краткими и выполнить следующее преобразование с group_by.

yearDf <- df %>% 
  group_by(year) %>%
  summarize(correlation = cor(x, y))

print(yearDf)
1 голос
/ 30 мая 2020

Вы можете group_by year и рассчитать корреляцию для x и y в каждом year. Кроме того, поскольку корреляция даст вам только одно число для каждого year, лучше summarise вместо mutate, потому что mutate будет повторять одно и то же значение для всех строк.

library(dplyr)
library(lubridate)

df %>% group_by(year = year(date)) %>% summarise(correlation = cor(x, y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...