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

我有一个混合的字符和数字variables的数据框 。

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 

我想将数据框中的所有小写字符转换为大写字母。 有没有办法一次完成这个任务,而不是在每个字符variables上重复执行?

从以下示例数据开始:

 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 

从dplyr包中,你也可以结合toupper()使用mutate_all()函数。 这将影响字符和因素类。

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

对于那些使用这些答案的人来说,这里有一个评论。 朱巴的答案是好的,因为如果你的variables是数字或string,它是非常有select性的。 但是,如果你有一个组合(例如a1,b1,a2,b2)等,它不会正确地转换字符。

正如@Trenton Hoffman所指出的那样,

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

影响人物和因素的类别,并为“混合variables”工作; 例如,如果你的variables同时包含一个字符和一个数值(例如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,] 

如果你使用基因组数据,这是知道这可以派上用场。

如果您需要处理包含您可以使用的因素的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 ja 0.1774909 2 b 2 kb 0.4405019 3 c 3 lc 0.7042878 4 d 4 md 0.8829965 5 e 5 ne 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 JA 2 B 2 KB 3 C 3 LC 4 D 4 MD 5 E 5 NE 

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

在R中使用函数很简单

f < – apply(f,2,toupper)

不需要检查列是字符还是其他types。