Использовать функциональное программирование и обновлять каждую итерацию базового кадра данных R? - PullRequest
0 голосов
/ 06 декабря 2018

Для данных данных я хочу запустить несколько имен столбцов, рассчитать что-то и добавить вывод в качестве нового столбца.Следующий расчет будет добавлен в качестве нового столбца к обновленному фрейму данных.

Например:

С учетом простого df:

df <- structure(list(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9), 
    d = c(10, 11, 12)), .Names = c("a", "b", "c", "d"), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))

Для каждого столбца a, b, c, d Я хочу вычислить, скажем, квадрат:

a2 = a^2
b2 = b^2 ...

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

Если бы я использовал цикл, он выглядел бы так:

for (x in column_names) {

     df <- df %>% mutate("x2" = x^2)

}

Так что каждыйвремя обновления моего df новым вычисляемым столбцом.

Посоветуйте, пожалуйста, как я могу это сделать без цикла for с функциональным программированием.

Я пытаюсь сделать это с map, lapply, ноУ меня проблема в том, что мой df не обновляется каждую итерацию.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Это функция, которую вы ищете?

add_x2 <- function(df, x) {
  df[paste0(x, "2")] <- df[x]^2
  df
}

df %>%
  add_x2(c("a", "b"))

# A tibble: 3 x 6
      a     b     c     d    a2    b2
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     4     7    10     1    16
2     2     5     8    11     4    25
3     3     6     9    12     9    36
0 голосов
/ 06 декабря 2018

С tidyverse:

df %>% 
+   mutate_if(is.numeric,funs(.^2))
# A tibble: 3 x 4
      a     b     c     d
  <dbl> <dbl> <dbl> <dbl>
1     1    16    49   100
2     4    25    64   121
3     9    36    81   144

или

df %>% mutate_all(funs(.^2))
# A tibble: 3 x 4
      a     b     c     d
  <dbl> <dbl> <dbl> <dbl>
1     1    16    49   100
2     4    25    64   121
3     9    36    81   144
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...