【问题标题】:mutate columns and modify columnanmes in a tibble变异列并修改小标题中的列名
【发布时间】:2019-11-05 15:27:21
【问题描述】:

我想写一个函数来记录一个小标题中所有列的日志:

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)))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是使用dplyr::mutate_at的方法

      test %>%
        mutate_at(
          .vars = vars(contains("value")),
          .funs = list(l = ~log(.))
          )
    

    【讨论】:

      【解决方案2】:

      这是我在遇到此问题时使用的基本 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
      

      【讨论】:

        【解决方案3】:

        另一个 tidyverse 解决方案,它可以泛化更多的列,而不仅仅是 value1value2

        tibble(
          date=c("1992-01-01","1992-01-02"),
          value1=c(1,2),
          value2=c(3,4)
        ) %>% 
          mutate_at(vars(-date), funs(l = log(.)))
        

        【讨论】:

        • 请注意,funs 已被弃用,取而代之的是使用函数列表(我知道,tidyverse 约定发展得非常快)
        猜你喜欢
        • 2022-01-19
        • 2020-12-20
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        相关资源
        最近更新 更多