Удаление na из столбца во время sumrize_at и приколов перед выполнением функции - PullRequest
0 голосов
/ 18 марта 2019

У меня есть повторяющиеся даты, столбец для возвратов, а затем множество других столбцов с другими переменными, по которым я пытаюсь отсортировать, а затем извлекать среднюю доходность верхнего квартиля отсортированных составляющих переменных для каждой даты.Есть NA, и я хочу игнорировать NA для каждого столбца отдельно при сортировке.

Исходные данные выглядят следующим образом

  date  return  a   b   c   d
    2/1/18  5   3   5   4   9
    2/1/18  6   2   1   NA  7
    2/1/18  5   NA  6   NA  5
    2/1/18  NA  1   NA  2   NA
    2/1/18  NA  NA  NA  1   NA
    2/2/18  NA  NA  2   NA  NA
    2/2/18  4   10  4   6   NA
    2/2/18  7   5   NA  2   NA
    2/2/18  8   7   7   9   NA
    2/3/18  NA  2   NA  NA  NA
    2/3/18  3   NA  6   5   8
    2/3/18  6   5   2   4   4
    2/3/18  5   8   8   1   9
    2/4/18  6   8   6   3   1
    2/4/18  5   2   5   9   10
    2/4/18  7   4   2   10  8

Я хочу, чтобы конечные данные отображались следующим образом

date    high a return   high b return   high c return   high d return
2/1/18  5   5   5   5
2/2/18  4   8   8   NA
2/3/18  8   5   3   5
2/4/18  6   6   7   5

Я пытаюсь переключить мой код с выполненияследующий раз для разных переменных.

High = df[!is.na(df$a),] %>%
    group_by(date) %>% 
    filter(a > quantile(a, .666)) %>%
    summarise(high_return = mean(return))

Я перешел на этот код, но не смог воспроизвести способ, которым я имел дело с na в предыдущем коде (т. Е.! Is.na).

list <- c("a", "b", "c", "d")
High <- df %>%
    group_by(date) %>%
        summarize_at(vars(one_of(list)),
                     funs(HighReturn = mean(return[na.omit(.) > quantile((.), .666, na.rm = TRUE)]))

Thisне дает те же результаты, что и столбцы один за другим.Я также попытался удалить na.omit, добавив na.omit справа "."и другие комбинации.Есть ли способ создать! Is.na для каждого столбца, когда он проходит через функцию?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Следуя логике вашего подхода, мы могли бы сделать

cols <- c("a", "b", "c", "d")

library(dplyr)

df %>%
  group_by(date) %>%
  summarise_at(vars(cols),
    funs(mean(return[. > quantile(., 0.666, na.rm = TRUE)], na.rm = TRUE)))

#   date       a     b     c     d
#  <fct>  <dbl> <dbl> <dbl> <dbl>
#1 2/1/18     5     5     5     5
#2 2/2/18     4     8     8   NaN
#3 2/3/18     5     5     3     5
#4 2/4/18     6     6     7     5

Однако, поскольку funs мягко устарела с dplyr 0.8.0 в пользу list, и если нам нужнопереименуйте столбцы, чтобы мы могли использовать

df %>%
  group_by(date) %>%
  summarise_at(vars(cols), 
    list( ~ mean(return[. > quantile(., 0.666, na.rm = T)], na.rm = TRUE))) %>%
  rename_at(vars(cols), list(~ paste0("high_return_", .)))

#   date   high_return_a high_return_b high_return_c high_return_d
#   <fct>          <dbl>         <dbl>         <dbl>         <dbl>
#1 2/1/18             5             5             5             5
#2 2/2/18             4             8             8           NaN
#3 2/3/18             5             5             3             5
#4 2/4/18             6             6             7             5
0 голосов
/ 18 марта 2019

Я предполагаю, что вы допустили ошибку для date = 2/2/18, где high return c должно быть 8 вместо 9.

Исходя из верности предположения, вы можете сделать следующее

list %>%
    map(~df %>%
        group_by(date) %>%
        filter(!!sym(.x) > quantile(!!sym(.x), 0.666, na.rm = T)) %>%
        summarise(!!sym(paste0("high_return_", .x)) := mean(return))) %>%
    reduce(full_join)
## A tibble: 4 x 5
#  date   high_return_a high_return_b high_return_c high_return_d
#  <fct>          <dbl>         <dbl>         <dbl>         <dbl>
#1 2/1/18             5             5             5             5
#2 2/2/18             4             8             8            NA
#3 2/3/18             5             5             3             5
#4 2/4/18             6             6             7             5

PS. return не является правильным именем столбца в R, так как return является именем внутренней функции R.


Пример данных

df <- read.table(text =
    "date  return  a   b   c   d
    2/1/18  5   3   5   4   9
    2/1/18  6   2   1   NA  7
    2/1/18  5   NA  6   NA  5
    2/1/18  NA  1   NA  2   NA
    2/1/18  NA  NA  NA  1   NA
    2/2/18  NA  NA  2   NA  NA
    2/2/18  4   10  4   6   NA
    2/2/18  7   5   NA  2   NA
    2/2/18  8   7   7   9   NA
    2/3/18  NA  2   NA  NA  NA
    2/3/18  3   NA  6   5   8
    2/3/18  6   5   2   4   4
    2/3/18  5   8   8   1   9
    2/4/18  6   8   6   3   1
    2/4/18  5   2   5   9   10
    2/4/18  7   4   2   10  8", header = T)


list <- c("a", "b", "c", "d")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...