将数据框中所有字符变量中的所有值从小写转换为大写


73

我有字符和数字变量的混合数据框

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

我想将数据框中的所有小写字符转换为大写。有什么方法可以一次完成一次操作,而不必在每个字符变量上重复执行此操作?

Answers:


81

从以下样本数据开始:

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

24
我也发现这也可行:df = as.data.frame(sapply(df,toupper))
user702432 2013年

47

dplyr包中,您还可以将mutate_all()功能与结合使用toupper()。这将影响字符和因子类。

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

3
从今天开始,对于任何人来说,请注意,它mutate_each()已贬值;而是(假设您希望将整个数字转换data.frame为上/下)mutate_all()
小家鼠

7
'mutate_at()'仅可用于一个变量
-Kevin Kevin

1
这对我有用:df <-mutate_all(df ,, funs(touper))
托尼·克罗宁

确保使用mutate_all(df, .funs = toupper)正确的语法,否则您将收到错误消息。应该有一个“。” 在funs参数之前。另外,如果您想坚持tidyverse使用,可以使用stringr str_to_upper而不是base toupper
bradylange


6

对于那些使用这些答案中的任何一个的人,这里都有一个补充说明。Juba的答案很好,因为无论您的变量是数字还是字符串,它都具有很高的选择性。但是,如果您有组合(例如a1,b1,a2,b2)等,它将无法正确转换字符。

正如@Trenton Hoffman所说,

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

影响字符类和因子类,并适用于“混合变量”;例如,如果您的变量同时包含字符和数字值(例如a1),则两者都将转换为因子。总体而言,这并不是什么大问题,但是如果最终您想要匹配数据。例如

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,]

如果您使用基因组数据,这是很方便的。


2

另一种选择是使用tidyverse包中的mutate_if()str_to_uper()函数的组合:

df %>% mutate_if(is.character, str_to_upper) -> df

这会将数据框中的所有字符串变量转换为大写。 str_to_lower()做相反的事情。


1

如果您需要处理包含因素的data.frame,则可以使用:

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"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.