web-dev-qa-db-ja.com

データフレーム内のすべての文字変数のすべての値を小文字から大文字に変換します

mixed 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

データフレーム内のすべての小文字を大文字に変換したい。各文字変数に対して繰り返し実行せずに、これをワンショットで実行する方法はありますか?

66
user702432

次のサンプルデータから開始します。

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
73
juba

Dplyrパッケージから、mutate_all()関数をtoupper()と組み合わせて使用​​することもできます。これは、文字クラスと因子クラスの両方に影響します。

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

Rのapply関数で簡単に

f <- apply(f,2,toupper)

列が文字または他のタイプであるかどうかを確認する必要はありません。

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

ゲノムデータを使用する場合、これが便利な場合があります。

6
OFish

使用できる要素を含む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"
1
mmann1123

別の代替方法は、mutate_if()関数とstr_to_uper()関数を組み合わせて、両方ともtidyverseパッケージから使用することです:

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

これにより、データフレーム内のすべての文字列変数が大文字に変換されます。 str_to_lower()はその逆を行います。