2013-05-13 1 views
46

У меня есть mixed dataframe символьных и числовых переменных.Преобразование из нижнего регистра в верхний регистр всех значений во всех символьных переменных в 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 

Я хочу преобразовать все символы нижнего регистра в dataframe в верхний регистр. Есть ли способ сделать это одним выстрелом, не повторяя его каждый символ?

ответ

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

Комментарий стороны для тех, кто использует любой из этих ответов. Ответ Джубы велик, поскольку он очень избирателен, если ваши переменные являются либо числовыми, либо символьными строками. Если, однако, у вас есть комбинация (например, a1, b1, a2, b2) и т. Д. Она не будет правильно преобразовывать символы.

Как отмечает @Trenton Хоффман,

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

влияет как на характер и фактор классов и работает для «смешанных переменных»; например если ваша переменная содержит как символ, так и числовое значение (например, a1), оба будут преобразованы в коэффициент. В целом это не слишком большая проблема, но если вы в конечном итоге хочет матч data.frames, например

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

где df1 было преобразовано и df2 содержит не преобразованный data.frame или аналогичный , это может вызвать некоторые проблемы. Обходной, что вы кратко должны запустить

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 

В то время как

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

Это просто с применить функцию в R

< е - применяются (п, 2, TOUPPER)

Нет необходимости, чтобы проверить, если столбец является символ или любой другой тип.