【问题标题】:rename multiple variables with pattern mutate_at [duplicate]使用模式 mutate_at 重命名多个变量 [重复]
【发布时间】:2020-04-03 10:35:35
【问题描述】:

我有一个包含许多具有相似名称的列的数据集。一些列的值以美分表示,而另一些列以美元表示,例如:

library (tidyverse) 

data<- tribble(
          ~col1_cents, ~col1,~col2_cents, ~col2,
          1000,           NA,       3000,    NA,
          NA,             20,         NA,  25.2,
          2000,           NA,       2030,    NA,
        )

对于一个变量,很容易将值除以100,然后将其分配给美元变量,并删除分变量例如:

data %>% mutate( if_else(is.na(col1),
                         col1_cents/100,
                         col1) %>% 
         select(-col1_cents)

对于数据集中以 _cents 结尾的所有变量,是否有一种通用的方法来执行此操作?我用 mutate_at 和 ends_with 尝试了这个,但没有 _cents 无法让它重命名为原始变量......

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以使用mutate_at

    library(dplyr)
    data %>%  mutate_at(vars(ends_with("cents")), ~./100)
    
    # A tibble: 3 x 4
    #   col1_cents  col1 col2_cents  col2
    #       <dbl> <dbl>      <dbl> <dbl>
    #1         10    NA       30    NA  
    #2         NA    20       NA    25.2
    #3         20    NA       20.3  NA  
    

    如果您想合并这两列,我们可以使用split.default 根据名称的相似性拆分列,使用purrr 中的imap_dfccoalesce 将它们合并在一起。

    df1 <- data %>%  mutate_at(vars(ends_with("cents")), ~./100)
    
    purrr::imap_dfc(split.default(df1, sub("_.*", "", names(df1))), 
     ~.x %>% mutate(!!.y := coalesce(.x[[2]], .x[[1]])) %>% select(.y))
    
    #  col1  col2
    #  <dbl> <dbl>
    #1    10  30  
    #2    20  25.2
    #3    20  20.3
    

    【讨论】:

    • 太棒了!我最挣扎的一点是合并这两个值。所以一旦你划分了美分/100,你怎么说 col1 = if_else(is.na(col1),col1_cents,col1) ?谢谢。 rename_all 不起作用,因为数据框有很多列名。
    • @JonathanNolan 你可以使用coalesce。查看更新的答案。
    • 这也很方便!问题是我试图在一个变量名称和数量未知的函数中编写它。我想以这种方式替换所有以 _cents 结尾的变量,无论它们的名称或数字如何。在这个例子中它是 col1,col1_cents,col2,col2_cents 但如果数据集恰好有一百个具有这种模式的变量,我希望它能够工作。
    • @JonathanNolan 我明白了。你现在可以查看更新的答案吗?
    • 谢谢!你的提示帮助我找到了这个解决方案:stackoverflow.com/questions/54971918/…
    猜你喜欢
    • 2020-08-06
    • 2021-10-22
    • 1970-01-01
    • 2019-09-09
    • 2019-04-21
    • 2014-06-26
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    相关资源
    最近更新 更多