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 に答える
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

もう 1 つの方法は、tidyverse パッケージのmutate_if()と関数の組み合わせを使用することです。str_to_upper()

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

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

于 2019-05-26T20:28:59.030 に答える