【问题标题】:Adding to columns with paste in mutate_at在 mutate_at 中使用粘贴添加到列
【发布时间】:2018-10-26 07:01:26
【问题描述】:

我有以下测试数据:

structure(list(testcode = structure(1:3, .Label = c("1", "20", 
"300"), class = "factor"), testname = structure(c(2L, 3L, 1L), .Label = c("Bed", 
"Book", "Car"), class = "factor")), .Names = c("testcode", "testname"
), row.names = c(NA, -3L), class = "data.frame")

我有一个函数可以识别一个特定的列名,然后在该列中的变量中添加一个前导零作为一个字符。 (所有列都是字符)。由于“代码”列中的列变量是可变长度的,我认为使用 paste0 作为paste0("0",column_name) 是最简单的。

函数如下:

library(dplyr)

fix_codes <- function(df) {
  code_column <- grep("code$", colnames(df), value = TRUE)

  df <- df %>%
    mutate_at(.vars = code_column, .funs = funs(paste0("0",code_column)))
  return(df)
}

但是,paste0 似乎不明白我想将 code_column 指定的列粘贴在一起,而不是像现在这样粘贴“code_column”本身。如何让 paste0 正确识别?

我想得到什么:

testcode   testname
01         Book
020        Car
0300       Bed

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用. 代替paste 应用于所选列的实际值

    fix_codes <- function(df) {
       code_column <- grep("code$", colnames(df), value = TRUE)
       df <- df %>%
           mutate_at(.vars = code_column, .funs = funs(paste0("0",.)))
       return(df)
    }
    
    df
    
    #  testcode testname
    #1        1     Book
    #2       20      Car
    #3      300      Bed
    
    fix_codes(df)
    #  testcode testname
    #1       01     Book
    #2      020      Car
    #3     0300      Bed
    

    使用lapply 的等效基本 R 方法也是我们直接选择列的地方

    df[grep("code$", colnames(df))][] <- 
             lapply(df[grep("code$", colnames(df))], function(x) paste0("0", x))
    

    【讨论】:

    • 谢谢!这完美地工作。你会说同样的方法适用于filter_at(.vars = code_column, .funs = funs(. %in% c("Book","Car")))吗?好像报错了
    • @Haakonkas 因为code_column 没有值c("Book","Car")。我们已经排除了它们,它在testname 列中。
    • 对不起,我写错了,我的意思是filter_at(.vars = code_column, .funs = funs(. %in% c("01","020")))
    • @Haakonkas filter_at 中没有.funs 参数,我们需要为其选择.vars_predicatedf %&gt;% filter_at(.vars = code_column, .vars_predicate = any_vars(. %in% c("01","020")))。在?filter_at 上查看解释并附上示例。
    • 你也可以在函数中使用vars(ends_with("code"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多