मैंने इस समस्या को फिर से कोड करने के लिए mutate और fct_recode फ़ंक्शंस के माध्यम से लूपिंग करने का प्रयास किया है लेकिन सफल नहीं हुआ। क्या इसके आसपास कोई रास्ता है चाहे वह साफ-सुथरा हो या किसी अन्य तरीके से? वाचालता के लिए क्षमा करें-मैं यथासंभव स्पष्ट होना चाहता था।

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
2
Moses 1 अप्रैल 2021, 10:33

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
2
Ronak Shah 1 अप्रैल 2021, 10:40

data.table का उपयोग करना

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

ओपी के 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 = '')))
0
akrun 1 अप्रैल 2021, 21:31