【问题标题】:Is there a way to use a loop inside the tidyverse ecosystem?有没有办法在 tidyverse 生态系统中使用循环?
【发布时间】:2021-06-28 04:45:09
【问题描述】:

我尝试循环遍历 mutate 和 fct_recode 函数来重新编码这个问题,但没有成功。有没有办法以 tidyverse 或任何其他方式解决它?抱歉冗长-我想尽可能清楚。

set.seed(2021)

df <- tibble(

  a1 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("", "Yes")),
  a2 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("", "Yes")),
  b1 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("", "Yes")),
  b2 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("", "Yes")),
  d1 = gl(2, 15, labels = c("Males", "Females")),
  d2 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("Python", "R"))
)

df %>% count(a1)

# Replace "" with No

myvars <- c("a1", "a2", "b1", "b2")


df %>% mutate(a1 = factor(if_else(a1 == "", "No",
                                  as.character(a1))),
              a2 = factor(if_else(a1 == "", "No",
                                as.character(a1))),
              b1= factor(if_else(b1== "", "No",
                                  as.character(b1))))

#---- Attempt one (forloop)

# Desire for all the variables

for (i in myvars){

  df <- df %>%
    mutate(i = factor(if_else(i == "", "No",
                              as.character(i))))
}

df %>% count(a1) # No replacement

【问题讨论】:

    标签: r for-loop dplyr tidyverse


    【解决方案1】:

    使用data.table

    library(data.table)
    setDT(df)[, (myvars) := lapply(.SD, function(x) factor(fifelse(x == "", "No",
                 as.character(x))), .SDcols = myvars]
    

    在我们需要的 OP 的 for 循环中

    for (i in myvars){
    
    df <- df %>%
        mutate(!! i := factor(if_else(!! rlang::sym(i) == "", "No",
                              as.character(!! rlang::sym(i)))))
      } 
    
    df %>% 
        count(a1)
    # A tibble: 2 x 2
    #  a1        n
    #* <fct> <int>
    #1 No       12
    #2 Yes      18
    

    或者我们可以使用fct_recode

    library(forcats)
    df %>%
        mutate(across(all_of(myvars), ~ fct_recode(., No = '')))
    

    【讨论】:

      【解决方案2】:

      tidyverse 有自己的“循环”功能。

      要将函数应用于多列,您可以使用across

      library(dplyr)
      
      df <- df %>% mutate(across(all_of(myvars), 
                     ~factor(if_else(. == "", "No", as.character(.)))))
      
      df %>% count(a1)
      
      #  a1        n
      #  <fct> <int>
      #1 No       12
      #2 Yes      18
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-22
        • 2011-04-30
        • 2023-03-04
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        相关资源
        最近更新 更多