82

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

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

我想将数据框中的所有小写字符转换为大写。有没有什么方法可以一次性做到这一点,而无需对每个字符变量重复执行此操作?

4

8 回答 8

86

从以下示例数据开始:

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
于 2013-05-13T07:22:06.710 回答
56

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

library(dplyr)
df <- mutate_all(df, funs=toupper)
于 2015-05-20T18:31:01.983 回答
10

在R中使用apply函数很简单

f <- apply(f,2,toupper)

无需检查该列是字符还是任何其他类型。

于 2017-11-14T10:32:03.180 回答
6

对于那些使用任何这些答案的人来说,这里有一个侧面评论。Juba 的答案很棒,因为如果您的变量是数字或字符串,它非常有选择性。但是,如果您有组合(例如 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,]

如果您使用基因组数据,那么知道这可以派上用场。

于 2015-06-11T02:09:27.260 回答
5

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

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

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

于 2019-05-26T20:28:59.030 回答
4

dplyr >= 1.0.0

_if以, _at,结尾的作用域动词已被1.0.0 或更高版本中_all的使用所取代。为此,请使用:across()packageVersion("dplyr")across

df %>% 
  mutate(across(where(is.character), toupper))
  • 第一个参数是使用tidyselect语法across转换哪些列。以上将在所有字符列中应用该函数。
  • 第二个参数across是要应用的函数。这也支持 lambda 风格的语法:~ toupper(.x)这使得设置额外的函数参数变得简单明了。

数据

df <- structure(list(city = c("Austin", "Austin", "Austin", "Austin", 
"Austin", "Austin", "Austin", "Austin", "Austin", "Austin"), 
    hs_cd = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), sl_no = c(2L, 
    3L, 4L, 5L, 2L, 1L, 3L, 4L, 3L, 1L), col_01 = c(NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA), col_02 = c(46L, 32L, 27L, 20L, 
    42L, 52L, 25L, 22L, 30L, 65L), col_03 = c("Female", "Male", 
    "Male", "Female", "Female", "Male", "Male", "Female", "Female", 
    "Female")), class = "data.frame", row.names = c(NA, -10L))
于 2021-03-15T17:26:55.170 回答
2

如果您需要处理包含您可以使用的因素的 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"
于 2016-09-19T19:59:06.000 回答
1

或者,如果您只想将特定行转换为大写,请使用以下代码:

df[[1]] <- toupper(df[[1]])
于 2019-08-12T06:05:32.727 回答