Преобразование из нижнего регистра в верхний регистр всех значений во всех символьных переменных в 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 в верхний регистр. Есть ли способ сделать это одним выстрелом, не повторяя его каждый символ?
Ответы
Ответ 1
Начиная со следующих данных:
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
Ответ 2
В пакете dplyr вы также можете использовать функцию mutate_all() в сочетании с toupper(). Это затронет как классы символов, так и факторы.
library(dplyr)
df <- mutate_all(df, funs=toupper)
Ответ 3
Компонентный комментарий для тех, кто использует любой из этих ответов. Ответ Джубы велик, так как он очень избирателен, если ваши переменные являются либо числовыми, либо символьными строками. Если, однако, у вас есть комбинация (например, a1, b1, a2, b2) и т.д. Она не будет правильно преобразовывать символы.
Как отмечает @Trenton Hoffman,
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,]
Если вы работаете с геномными данными, это значит, что знать это может пригодиться.
Ответ 4
Это просто с применением функции в R
f <- apply(f,2,toupper)
Не нужно проверять, является ли столбец символьным или любым другим типом.
Ответ 5
Если вам нужно иметь дело с 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"
Ответ 6
Другой альтернативой является использование комбинации функций mutate_if() и str_to_uper(), оба из пакета tidyverse:
df %>% mutate_if(is.character, str_to_upper) -> df
Это преобразует все строковые переменные в фрейме данных в верхний регистр. str_to_lower() делает обратное.