Подтвердить что ты не робот

Преобразование из нижнего регистра в верхний регистр всех значений во всех символьных переменных в 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 в верхний регистр. Есть ли способ сделать это одним выстрелом, не повторяя его каждый символ?

4b9b3361

Ответ 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() делает обратное.