【问题标题】:Rename columns on the fly during lapply tidy在 lapply tidy 期间动态重命名列
【发布时间】:2020-03-03 12:14:59
【问题描述】:

我想在使用过程中动态命名/重命名数据框/小标题的列 lapply 操作。 例如:

df <- tibble(names = rep("abc",100), 
              number1 = sample(1:1000, size = 100),
              number2 = sample(10:900, size = 100),
              char_1 = sample(c("a","b","c"), size = 100, replace = TRUE), 
              number3 = round(rnorm(100, mean = 100)))
files_names <- df %>% 
  distinct(char_1 ) %>% 
  deframe %>% as.list()
names(files_names) <- files_names
lapply()
df_a <- df %>% filter(char_1 == "a")

lst_files <- lapply(files_names, function(x){
 df %>% filter(char_1 == x) %>% 
    mutate(str_glue("{x}_num3") = number3 +100)
})

Error: unexpected '=' in: " df %>% filter(char_1 == x) %>% mutate(str_glue("{x}_num3") =" }) Error: unexpected '}' in "}"

在这个例子中,我使用了 mutate 函数,当然,我得到了一个错误,

但一般来说,我需要使用 lapply 中的选择/重命名或变异操作

最好与str_glue函数的组合或 粘贴。 感谢您的宝贵时间!

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    我们可以在这里使用:= 进行分配。使用tidyverse,我们可以使用map 循环遍历list 元素(类似于base R 中的lapply),然后在filter 之后基于传递给map 的唯一元素的行,通过传递字符串并计算 (!!),使用赋值运算符 (:=) 即时创建带有 mutate 的列。 str_cbase R 中的 paste 执行类似的操作,只是在存在 NAs 时其行为略有不同

    library(purrr)
    library(stringr)
    map(files_names, ~ 
           df %>% 
              filter(char_1 == .x) %>%
              mutate(!!str_c(.x, "_num3") := number3 + 100))
    

    【讨论】:

    • 可以加个小解释吗?
    【解决方案2】:

    在基础 R 中,我们可以在 files_names 上使用 lapplysubset df 基于它,添加一个带有 transform 的新列,并使用 setNames 分配名称

    lapply(files_names, function(x) setNames(transform(subset(df, char_1 == x), 
               temp = number3 + 100), c(names(df), paste0(x,"_num3"))))
    
    #$c
    #   names number1 number2 char_1 number3 c_num3
    #1    abc     463     680      c     100    200
    #2    abc     244      76      c     100    200
    #3    abc      14     672      c     100    200
    #4    abc     603     657      c     101    201
    #5    abc     709      83      c      99    199
    #....
    

    数据

    set.seed(123)
    df <- tibble(names = rep("abc",100), 
             number1 = sample(1:1000, size = 100),
             number2 = sample(10:900, size = 100),
             char_1 = sample(c("a","b","c"), size = 100, replace = TRUE), 
             number3 = round(rnorm(100, mean = 100)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2016-12-14
      相关资源
      最近更新 更多