データ型を変更するには、次のようなものを使用できます
l1 <- c("fac1","fac2","fac3")
l2 <- c("dbl1","dbl2","dbl3")
dat[,l1] <- lapply(dat[,l1], factor)
dat[,l2] <- lapply(dat[,l2], as.numeric)
dplyr
dat <- dat %>% mutate(
fac1 = factor(fac1), fac2 = factor(fac2), fac3 = factor(fac3),
dbl1 = as.numeric(dbl1), dbl2 = as.numeric(dbl2), dbl3 = as.numeric(dbl3)
)
dplyrにはもっとエレガントな(短い)方法がありますか?
クリストフ
mutate_each
の標準評価版(mutate_each_
)を使用して、列クラスを変更できます。
dat %>% mutate_each_(funs(factor), l1) %>% mutate_each_(funs(as.numeric), l2)
?mutate_each
の下部(少なくともdplyr 0.5)では、@ docendo discimusの答えのように、その関数は非推奨になり、より柔軟な代替手段mutate_if
、mutate_all
に置き換えられます、およびmutate_at
。 @hadleyが彼のコメントで言及しているものに最もよく似ているのは、おそらくmutate_at
を使用していることです。 mutate_each
と比較して、引数の順序が逆になっていることに注意してください。また、vars()
は?select_helpers
関数を意味すると解釈されるselect()
のようなセマンティクスを使用します。
dat %>% mutate_at(vars(starts_with("fac")),funs(factor)) %>%
mutate_at(vars(starts_with("dbl")),funs(as.numeric))
しかし、mutate_at
はvars()
引数の代わりに列番号を取ることができ、このページを読み、代替案を調べた後、mutate_at
を使用しましたが、grep
はさまざまな種類の列名を一度にキャプチャします(このような明白な列名を常に持っている場合を除きます!)
dat %>% mutate_at(grep("^(fac|fctr|fckr)",colnames(.)),funs(factor)) %>%
mutate_at(grep("^(dbl|num|qty)",colnames(.)),funs(as.numeric))
mutate_at
+ grep
を理解することに非常に興奮しました。これは、1行でlotsの列を処理できるようになったためです。
編集-正規表現を処理するselect_helpersにmatches()
が表示されるようになったので、今はこれが好きです。
dat %>% mutate_at(vars(matches("fac|fctr|fckr")),funs(factor)) %>%
mutate_at(vars(matches("dbl|num|qty")),funs(as.numeric))
別の一般的に関連するコメント-一致する名前と一貫した形式のすべての日付列がある場合、これは強力です。私の場合、これは数字として読み取られたすべてのYYYYMMDD列を日付に変換します。
mutate_at(vars(matches("_DT$")),funs(as.Date(as.character(.),format="%Y%m%d")))
ニックの答えは今では廃止されており、ラファエルのコメントは本当に便利なので、これを回答として追加したいと思います。 allfactor
列をcharacter
に変更する場合は、mutate_if
を使用します。
dat %>% mutate_if(is.factor, as.character)
他の機能も許可されています。たとえば、iconv
を使用して、すべてのcharacter
列のエンコードを変更しました。
dat %>% mutate_if(is.character, function(x){iconv(x, to = "ASCII//TRANSLIT")})
または、数値列のすべてのNA
を0に置き換えるには:
dat %>% mutate_if(is.numeric, function(x){ifelse(is.na(x), 0, x)})
列タイプの変換を実現するより一般的な方法は次のとおりです。
すべてのfactor列をcharacter列に変換する場合、たとえば、これは1つのパイプを使用して実行できます。
df %>% mutate_each_( funs(as.character(.)), names( .[,sapply(., is.factor)] ))
mutate_at
を含むワンライナーです。
dat %>% mutate_at("l1", factor) %>% mutate_at("l2", as.numeric)
または、convert
のhablar
を使用すると、さらに簡単になります。
library(hablar)
dat %>%
convert(fct(fac1, fac2, fac3),
num(dbl1, dbl2, dbl3))
またはtidyselect
と組み合わせます:
dat %>%
convert(fct(contains("fac")),
num(contains("dbl")))