мутировать столбцы и изменять столбцы в таблице - PullRequest
3 голосов
/ 05 ноября 2019

Я хочу написать функцию, которая принимает журнал всех столбцов в таблице:

test<-tibble(date=c("1992-01-01","1992-01-02"),
             value1=c(1,2),
             value2=c(3,4))

Сложность для меня заключается в том, что я хотел бы добавить логарифмическую переменную в качестве нового столбца и переменнуюимя должно иметь следующую форму: например: value_l. В dplyr это должно быть возможно с mutate_all, но кажется, что добавить туда вектор невозможно.

test %>% 
  select(-"date") %>% 
  mutate_at(funs(!!paste0(colnames(test)[2],"_l") := log(.)))

Мой код дает мне:

Error: The LHS of `:=` must be a string or a symbol
Call `rlang::last_error()` to see a backtrace.

Есть ли способ обойти это и остаться во вселенной dplyr в то же время?

test<-tibble(date=c("1992-01-01","1992-01-02"),
             value1=c(1,2),
             value2=c(3,4),
             value1_l=log(c(1,2)),
             value2_l=log(c(3,4)))

Ответы [ 3 ]

3 голосов
/ 05 ноября 2019

Это способ сделать это, используя dplyr::mutate_at

  test %>%
    mutate_at(
      .vars = vars(contains("value")),
      .funs = list(l = ~log(.))
      )
2 голосов
/ 05 ноября 2019

Вот базовое решение R, которое я использую, когда сталкиваюсь с этой проблемой:

test[paste0(names(test)[-1], "_log")] <- lapply(test[-1], log)

  date       value1 value2 value1_log value2_log
  <chr>       <dbl>  <dbl>      <dbl>      <dbl>
1 1992-01-01      1      3      0           1.10
2 1992-01-02      2      4      0.693       1.39
1 голос
/ 05 ноября 2019

Еще одно решение для Tidyverse, которое обобщает больше столбцов, чем просто value1 и value2.

tibble(
  date=c("1992-01-01","1992-01-02"),
  value1=c(1,2),
  value2=c(3,4)
) %>% 
  mutate_at(vars(-date), funs(l = log(.)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...