मुझे लूप में किसी निश्चित डेटासेट के एक निश्चित कॉलम में लेखन के संयोजन में समस्या हो रही है। मूल रूप से मेरे पास समान रूप से संरचित डेटासेट w2,w4,w5,w6,w7,w8 हैं और मैं प्रत्येक डेटासेट के एक ही कॉलम पर एक ही ऑपरेशन करना चाहता हूं। उदाहरण के लिए, मैं लिंग चर को 1 = पुरुष, 2 = महिला से 0 = पुरुष, 1 = महिला और फिर इसे कारक बनाना चाहता हूं। यहां बताया गया है कि मैं इसे w2 के लिए कैसे करता हूं।

w2$gender <- case_when(w2$gender == 1 ~ 0, w2$gender == 2 ~ 1)
w2$gender <- factor(w2$gender,
                    levels = c(0,1),
                    labels = c("Male","Female"))

मैं एक लूप के लिए बनाना चाहता हूं जो इसे मेरे सभी डेटाफ्रेम के लिए करता है, लेकिन मैं लगातार मुद्दों में भाग रहा हूं क्योंकि मैं बदलते डेटासेट के कॉलम को संबोधित नहीं कर सकता।

for(i in w){
  z <- paste0("w",i)
  eval(call( "<-",eval(as.name(z))[,4], case_when(eval(as.name(z))[,4] == 1 ~ 0, eval(as.name(z))[,4] == 2 ~ 1)))
}

मुझे त्रुटि मिलती है:

c(2, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 1, : अमान्य (do_set) शेष में त्रुटि -हाथ की ओर असाइनमेंट

मैंने कई अलग-अलग तरीकों की कोशिश की जैसे असाइन फ़ंक्शन आदि का उपयोग करना, लेकिन कुछ भी काम नहीं करता है। क्या आप एक आसान तरीका जानते हैं कि यह कैसे किया जा सकता है?

2
Phate 17 जुलाई 2021, 21:43

2 जवाब

सबसे बढ़िया उत्तर

यदि हम लूप का उपयोग करना चाहते हैं, तो सूची में के साथ ऑब्जेक्ट्स के मान (w1, w2, ..) प्राप्त करें। mget, सूची पर मानचित्र के साथ लूप करें और 1 से मानों को बदलने के लिए लिंग को म्यूट करें , 2 से 'पुरुष', 'महिला' क्रमशः (पहले 1, 2 को 0, 1 में बदलने और R की तरह इसे वापस बदलने की कोई आवश्यकता नहीं है, अनुक्रमण 1 से शुरू होता है)

library(dplyr)
library(purrr)
lst1 <- mget(ls(pattern = '^w\\d+$')) %>%
      map(~ .x %>%
                mutate(gender =  factor(c("Male", "Female")[gender], 
            levels = c("Male", "Female"))))

यदि हम मूल वस्तुओं को अद्यतन करना चाहते हैं, तो list2env का उपयोग करें

list2env(lst1, .GlobalEnv)
2
akrun 17 जुलाई 2021, 23:01

हम आपके डेटाफ़्रेम को एक सूची list_df में सहेज सकते हैं और फिर सूची के सभी तत्वों (डेटाफ़्रेम) पर my_function फ़ंक्शन लागू कर सकते हैं: @akrun: आपको क्या लगता है यह उचित है?

library(dplyr)
my_function <- function(x) {          # x is the dataframe you want to change
  x$gender <- case_when(x$gender == 1 ~ 0, 
                        x$gender == 2 ~ 1)
  x$gender <- factor(x$gender,
                     levels = c(0,1),
                     labels = c("Male", "Female"))
  return(x)
}

df1 <- structure(list(gender = c(1, 1, 2, 2)), row.names = c(NA, -4L
), class = c("tbl_df", "tbl", "data.frame"))

df2 <- structure(list(gender = c(2, 1, 1, 2)), row.names = c(NA, -4L
), class = c("tbl_df", "tbl", "data.frame"))

list_df <- as.list(c(df1, df2))

library(purrr)
list_df %>% lmap(my_function) 

आउटपुट:

$gender
[1] Male   Male   Female Female
Levels: Male Female

$gender
[1] Female Male   Male   Female
Levels: Male Female

1
TarJae 17 जुलाई 2021, 23:29