मेरे पास 1 = हाँ और 2 = नहीं के साथ कोडित कारकों वाला डेटाफ़्रेम है। सभी कारकों को _L पर समाप्त होने वाले नाम दिए गए हैं। ध्यान दें कि वास्तविक डेटाफ़्रेम में, वे सभी एक दूसरे के बगल में नहीं हैं।

df <- data.frame(var_L = factor(c(1,1,1,2,2,2), labels = c("yes","no")),
                 var2_L = factor(c(1,2,1,2,1,2), labels = c("yes","no")),
                 var3_L = factor(c(1,1,2,2,1,2), labels = c("yes","no")))

मैं स्तर/लेबल 1 = हाँ से 0 = सत्य और 2 = नहीं से 1 = झूठ बदलना चाहता हूँ। मैं उन्हें उनके नाम से आरओ रिकोड करना चाहता हूं, और 100 से अधिक चर हैं।

मैं तीन दिनों से एक समाधान खोज रहा हूं, लेकिन मुझे एक ही बार में स्तर और लेबल बदलने और इसे कई चर के लिए करने का आदेश नहीं मिल रहा है।

1
Aggi 29 मार्च 2020, 16:07

2 जवाब

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

यदि आपके पास इसके समान डेटा है:

df <- data.frame(id = 1:3, A_L = c('1 = yes', '2 = no', '1 = yes'), 
                 B_L = c('2 = no', '1 = yes', '1 = yes'))

आप कई कॉलम में फ़ंक्शन लागू करने के लिए mutate_at और मानों को बदलने के लिए recode का उपयोग कर सकते हैं।

library(dplyr)
df %>%
   mutate_at(vars(contains('_L')), 
            ~recode(., '1 = yes' = '0 = truth', '2 = no' = '1 = lie'))

#  id       A_L       B_L
#1  1 0 = truth   1 = lie
#2  2   1 = lie 0 = truth
#3  3 0 = truth 0 = truth

या आधार आर में:

cols <- grep('_L', names(df))
df[cols] <- lapply(df[cols], function(x) 
                 ifelse(x == '1 = yes', '0 = truth', '1 = lie'))
0
Ronak Shah 29 मार्च 2020, 17:06
म्यूट के साथ कोड ने थोड़ी मदद की। शायद आप जानते हैं कि निम्नलिखित कोड में क्या गलत है। यह भाग (कारकों को अंकीय करने और मानों को बदलने के लिए) काम करता है: df <- df %>% mutate_at(vars(starts_with("u_")), ~as.numeric(.)) %>% mutate_at(vars(starts_with("u_")), ~recode(., '1' = 1, '2' = 0)) फिर मैंने इसे 0=lie और 1=truth df <- df %>% mutate_at(vars(starts_with("u_")), ~as.factor, levels = c(0, 1), labels = c("lie", "truth")) के साथ फिर से कारकों में बदलने की कोशिश की और एक त्रुटि मिली: Column 'u_..._L' is of unsupported type function
 – 
Aggi
13 अप्रैल 2020, 23:31
1
~ को सामने से हटा दें। कोशिश करें: df <- df %>% mutate_at(vars(starts_with("u_")), factor, levels = c(0, 1), labels = c("lie", "truth"))
 – 
Ronak Shah
14 अप्रैल 2020, 02:23
जब मैं इसे ~ के बिना उपरोक्त के रूप में करता हूं तो मुझे निम्न त्रुटि मिलती है: error in (function (x) : unused arguments (levels = c(0, 1), labels = c("lie", "truth"))
 – 
Aggi
15 अप्रैल 2020, 11:26
1
याद रखें कि आपको factor का उपयोग करना है न कि as.factor का। as.factor में levels और labels तर्क नहीं हैं।
 – 
Ronak Shah
15 अप्रैल 2020, 11:47
यह चलने लगा। लेकिन अब भी एक समस्या है। कोड अब इस तरह दिखता है: df <- df %>% mutate_at(vars(starts_with("u_")), ~as.numeric(.)) %>% mutate_at(vars(starts_with("u_")), ~recode(., '1' = 1, '2' = 0)) %>% mutate_at(vars(starts_with("u_")), factor, levels = c(0, 1), labels = c("lie", "truth")) अंत में मेरे पास झूठ और सच्चाई के लेबल हैं, लेकिन फिर भी मान 1 और 2 हैं।
 – 
Aggi
15 अप्रैल 2020, 12:41

मैं आपको data.table के आधार पर एक हैक प्रस्तावित कर सकता हूं। ऐसा करने का एक और शानदार तरीका हो सकता है लेकिन कोड बहुत आसान है। यदि मैं नए कॉलम नहीं बना रहा था तो कोड छोटा हो सकता है लेकिन मैं समाधान के तर्क को दिखाने के लिए ऐसा करता हूं

library(data.table)


df <- data.table(solution_L = factor(c(0,1), labels = c("yes","no")),
                 solution2_L = factor(c(0,0), labels = c("yes")))
# df
# solution_L solution2_L
# 1:        yes         yes
# 2:         no         yes

आपको शायद अपने डेटाफ़्रेम को data.table ऑब्जेक्ट में बदलना होगा, setDT या as.data.table का उपयोग करना होगा। सावधानी के लिए, चूंकि data.table संदर्भ द्वारा अपडेट होते हैं, इसलिए आपको अपने मूल डेटासेट की एक प्रति बनानी चाहिए

उन स्तंभों का पता लगाएं जिन्हें आपको बदलने की आवश्यकता है endsWith (या यदि आप चाहें तो एक नियमित अभिव्यक्ति):

cols_to_recode <- colnames(df)[endsWith(colnames(df), suffix = "_L")]

यहाँ हैक आता है। आप प्रत्येक कॉलम पर लागू करने के लिए एक lapply बनाते हैं

  1. चरित्र में रूपांतरण
  2. नाम के आधार पर एक नया कॉलम बनाएं जो सभी अवलोकनों के लिए सत्य के बराबर हो
  3. टिप्पणियों के लिए "नहीं" से बदलें
df_modif <- lapply(cols_to_recode,
       function(cname){
         df[, c(cname) := as.character(get(cname))]
         df[,c(paste0(cname,"_r")) := "truth"]
         df[(get(cname) == "no"), c(paste0(cname,"_r")) := "lie"]
       })
df_modif <- df_modif[[length(df_modif)]]

अंतिम पंक्ति यहां आपको केवल सूची के अंतिम तत्व को रखने के लिए है क्योंकि आपने अपने data.table को बार-बार अपडेट किया है।

अंत में, यदि आप पुराने कॉलम नामों को प्राथमिकता देते हैं, तो आप पुराने कॉलम को छोड़ सकते हैं:

df_modif[, c(cols_to_recode) := NULL]
# df_modif
# solution_L_r solution2_L_r
# 1:        truth         truth
# 2:          lie         truth

और पुराने नामों के रूप में रिकोड किए गए चर के नाम सेट करें

data.table::setnames(df_modif,
                     new = cols_to_recode,
                     old = paste0(cols_to_recode, "_r")
)
# df_modif                     
# solution_L solution2_L
# 1:      truth       truth
# 2:        lie       truth                     

आशा है कि यह स्पष्ट है!

0
linog 29 मार्च 2020, 16:30