Мутировать несколько столбцов с условием в функции карты - PullRequest
0 голосов
/ 09 марта 2019

Я хочу создать несколько столбцов с условием ifelse () для нескольких фреймов данных. Вот мой пример кода:

df1 <- tibble( 
date = lubridate::today() +0:9,
return= runif(n = 10, min = 0, max = 5))

df2 <- tibble( 
date = lubridate::today() +0:9,
return= runif(n = 10, min = 0, max = 5))

df3 <- tibble( 
date = lubridate::today() +0:9,
return= runif(n = 10, min = 0, max = 5))

А теперь я хочу добавить новые столбцы с возрастающими условиями (от 1 до 5). Первый столбец должен содержать только значения из столбца return, который больше 1, второй столбец должен содержать только значения, превышающие 1,5, третий столбец должен содержать только значения, превышающие 2, и и так далее ...

Например, я могу сделать это с помощью цикла for. Но это работает только для одного кадра данных:

for(i in seq(1, 5, 0.5)){
varname =paste0("return>",i)
df1[[varname]] <- with(df1, ifelse(return > i, return, NA))
}

> head(df1)
# A tibble: 6 x 12
date       return `return > 0.5 s~ `return > 1 sd` `return > 1.5 s~ `return > 2 sd` `return > 2.5 s~
<date>      <dbl>            <dbl>           <dbl>            <dbl>           <dbl>            <dbl>
1 2019-03-09  4.94             4.94             4.94             4.94            4.94             4.94
2 2019-03-10  0.936            0.936           NA               NA              NA               NA   
3 2019-03-11  0.770            0.770           NA               NA              NA               NA   
4 2019-03-12  1.03             1.03             1.03            NA              NA               NA   
5 2019-03-13  3.34             3.34             3.34             3.34            3.34             3.34
6 2019-03-14  0.983            0.983           NA               NA              NA               NA   
# ... with 5 more variables: `return > 3 sd` <dbl>, `return > 3.5 sd` <dbl>, `return > 4 sd` <dbl>,
#   `return > 4.5 sd` <dbl>, `return > 5 sd` <dbl>

Вот другой код для получения желаемого вывода для одного кадра данных:

n <- seq(0.5, 5, 0.5)
df1[paste0("return > ", n, " sd")] <- lapply(n, function(x) 
replace(df1$return, df1$return <= x, NA))

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

1 Ответ

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

Поместите все кадры данных в список и создайте функцию для возврата новых столбцов

df_list <- list(df1, df2, df3)

return_new_cols <- function(df1) { 
  n <- seq(0.5, 5, 0.5)
  df1[paste0("return > ", n, " sd")] <- lapply(n, function(x) 
                            replace(df1$return, df1$return <= x, NA))
  df1
}

Теперь примените функцию return_new_cols к каждому фрейму данных в списке

lapply(df_list, return_new_cols)

Вы можете достичь того же с purrr::map вместо lapply

purrr::map(df_list, return_new_cols)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...