2013-05-13 12 views
46

में सभी वर्ण चरों में सभी मानों को लोअरकेस से अपरकेस में कनवर्ट करें मेरे पास वर्ण और संख्यात्मक चर के mixed dataframe हैं।डेटाफ्रेम

city,hs_cd,sl_no,col_01,col_02,col_03 
Austin,1,2,,46,Female 
Austin,1,3,,32,Male 
Austin,1,4,,27,Male 
Austin,1,5,,20,Female 
Austin,2,2,,42,Female 
Austin,2,1,,52,Male 
Austin,2,3,,25,Male 
Austin,2,4,,22,Female 
Austin,3,3,,30,Female 
Austin,3,1,,65,Female 

मैं डेटाफ्रेम में सभी लोअर-केस वर्णों को अपरकेस में कनवर्ट करना चाहता हूं। क्या प्रत्येक चरित्र-चर पर बार-बार ऐसा किए बिना एक शॉट में ऐसा करने का कोई तरीका है?

उत्तर

57

निम्न नमूना डेटा के साथ शुरू:

df <- data.frame(v1=letters[1:5],v2=1:5,v3=letters[10:14],stringsAsFactors=FALSE) 

    v1 v2 v3 
1 a 1 j 
2 b 2 k 
3 c 3 l 
4 d 4 m 
5 e 5 n 

आप उपयोग कर सकते हैं:

data.frame(lapply(df, function(v) { 
    if (is.character(v)) return(toupper(v)) 
    else return(v) 
})) 

कौन देता है:

v1 v2 v3 
1 A 1 J 
2 B 2 K 
3 C 3 L 
4 D 4 M 
5 E 5 N 
+11

मुझे अभी यह भी काम मिल गया है: df = as.data.frame (sapply (df, toupper)) – user702432

24

dplyr पैकेज आप भी mutate_all उपयोग कर सकते हैं (से) toupper() के साथ संयोजन में समारोह। यह चरित्र और कारक वर्ग दोनों को प्रभावित करेगा।

library(dplyr) 
df <- mutate_all(df, funs=toupper) 
+1

किसी भी व्यक्ति को आज से यह देखने के लिए, ध्यान दें कि 'mutate_each() 'की कमी है; इसके बजाए (मान लीजिए कि आप अपने पूरे 'data.frame' को ऊपरी/निचले हिस्से में परिवर्तित करना चाहते हैं),' mutate_all() 'का उपयोग करें। – MusTheDataGuy

+0

'mutate_at()' का उपयोग केवल एक चर के साथ काम करने के लिए किया जा सकता है – Kevin

4

इनमें से किसी भी उत्तर का उपयोग करने वालों के लिए यहां एक पक्ष टिप्पणी। जुबा का जवाब बहुत अच्छा है, क्योंकि यह बहुत ही चुनिंदा है यदि आपके चर या तो संख्यात्मक या चरित्र तार हैं। हालांकि, आपके पास संयोजन है (उदा। ए 1, बी 1, ए 2, बी 2) आदि। यह अक्षरों को सही ढंग से परिवर्तित नहीं करेगा।

रूप @Trenton हॉफमैन नोट

library(dplyr) 
df <- mutate_each(df, funs(toupper)) 

दोनों चरित्र और कारक वर्गों को प्रभावित करता है और "मिश्रित चर" के लिए काम करता है; जैसे यदि आपके चर में एक वर्ण और एक संख्यात्मक मान दोनों शामिल हैं (उदा। ए 1) दोनों को एक कारक में परिवर्तित कर दिया जाएगा। कुल मिलाकर यह एक चिंता का विषय बहुत ज्यादा नहीं है, लेकिन आप अंत अगर उदाहरण

df3 <- df1[df1$v1 %in% df2$v1,] 

किया गया जहां DF1 बदल दिया गया है गया है और df2 शामिल एक गैर परिवर्तित data.frame या इसी तरह के लिए मैच data.frames चाहने , इससे कुछ समस्याएं हो सकती हैं। आसपास काम आपको संक्षेप में

df2 <- df2 %>% mutate_each(funs(toupper), v1) 
#or 
df2 <- df2 %>% mutate_each(df2, funs(toupper)) 
#and then 
df3 <- df1[df1$v1 %in% df2$v1,] 

चलाने के लिए आप जीनोमिक डेटा के साथ काम करते हैं है कि है, यह जानते हुए भी जब इस काम में आ सकते हैं।

1

आप उपयोग कर सकते हैं आप data.frames कि कारकों में शामिल हैं के साथ सौदा करने की जरूरत है:

df = data.frame(v1=letters[1:5],v2=1:5,v3=letters[10:14],v4=as.factor(letters[1:5]),v5=runif(5),stringsAsFactors=FALSE) 

df 
    v1 v2 v3 v4  v5 
    1 a 1 j a 0.1774909 
    2 b 2 k b 0.4405019 
    3 c 3 l c 0.7042878 
    4 d 4 m d 0.8829965 
    5 e 5 n e 0.9702505 


sapply(df,class) 
     v1   v2   v3   v4   v5 
"character" "integer" "character" "factor" "numeric" 

उपयोग mutate_each_ चरित्र को कारकों कन्वर्ट करने के लिए तो अपरकेस में

upper_it = function(X){X %>% mutate_each_(funs(as.character(.)), names(.[sapply(., is.factor)])) %>% 
    mutate_each_(funs(toupper), names(.[sapply(., is.character)]))} # convert factor to character then uppercase 

देता

सभी परिवर्तित
upper_it(df) 
     v1 v2 v3 v4 
    1 A 1 J A 
    2 B 2 K B 
    3 C 3 L C 
    4 D 4 M D 
    5 E 5 N E 

जबकि

012 लागू (च, 2, toupper)

यदि स्तंभ चरित्र या किसी अन्य प्रकार है की जाँच की आवश्यकता नहीं है -

sapply(upper_it(df),class) 
     v1   v2   v3   v4   v5 
"character" "integer" "character" "character" "numeric" 
0
यह सरल आर

में

च < समारोह लागू साथ