【问题标题】:Mutate a New Column in R from matching substring从匹配的子字符串中改变 R 中的新列
【发布时间】:2021-12-27 10:19:14
【问题描述】:

尝试使用 mutate 根据变量值创建新列:

for (var in custom_vars) {
  devices_ <-
    devices %>%
      mutate(var = grepl({{var}}, cluster, fixed = TRUE) %>% as_factor())
}

但它不起作用。该列是使用正确的布尔值创建的,但名称设置为“var”。如何按预期将新列设置为 var 的值。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    sapply 中使用grepl 很简单,因为它已经给出了:

    sapply(custom_vars, grepl, dat$cluster)
    #          a     b
    # [1,]  TRUE  TRUE
    # [2,]  TRUE FALSE
    # [3,] FALSE  TRUE
    # [4,] FALSE FALSE
    

    然后只需 cbind 将其添加到初始数据帧。

    cbind(dat, sapply(custom_vars, grepl, dat$cluster))
    #   cluster          x     a     b
    # 1     abk 0.06279684  TRUE  TRUE
    # 2     akl 0.36972330  TRUE FALSE
    # 3     bkl 0.80486702 FALSE  TRUE
    # 4     klm 0.32781444 FALSE FALSE
    

    数据:

    dat <- data.frame(cluster=c('abk', 'akl', 'bkl', 'klm'), x=runif(4))
    

    【讨论】:

      【解决方案2】:

      如果您提供可用于验证答案的具有预期输出的示例数据,则更容易提供帮助。

      我尝试根据自己的理解创建示例数据。

      library(dplyr)
      
      df <- data.frame(a = 1:3, b = 3:1, cluster = c('abc', 'rds', 'dsb'))
      
      #  a b cluster
      #1 1 3     abc
      #2 2 2     rds
      #3 3 1     dsb
      
      custom_vars <- c('a', 'b')
      

      我们可以使用across 代替for 循环。

      df <- df %>%  
            mutate(across(all_of(custom_vars), ~factor(grepl(cur_column(), cluster))))
      
      str(df)
      #'data.frame':  3 obs. of  3 variables:
      # $ a      : Factor w/ 2 levels "FALSE","TRUE": 2 1 1
      # $ b      : Factor w/ 2 levels "FALSE","TRUE": 2 1 2
      # $ cluster: chr  "abc" "rds" "dsb"
      

      cur_column() 返回当前列名的名称,在grepl 中使用以查找模式,然后将逻辑值(TRUE/FALSE)更改为factor

      【讨论】:

        猜你喜欢
        • 2019-10-21
        • 2013-05-29
        • 2023-03-28
        • 2021-10-09
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-02
        相关资源
        最近更新 更多