web-dev-qa-db-ja.com

dplyrは多くのデータ型を変更します

データ型を変更するには、次のようなものを使用できます

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にはもっとエレガントな(短い)方法がありますか?

クリストフ

49
ckluss

mutate_eachの標準評価版(mutate_each_)を使用して、列クラスを変更できます。

dat %>% mutate_each_(funs(factor), l1) %>% mutate_each_(funs(as.numeric), l2)
46

?mutate_eachの下部(少なくともdplyr 0.5)では、@ docendo discimusの答えのように、その関数は非推奨になり、より柔軟な代替手段mutate_ifmutate_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_atvars()引数の代わりに列番号を取ることができ、このページを読み、代替案を調べた後、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")))
42
Rafael Zayas

ニックの答えは今では廃止されており、ラファエルのコメントは本当に便利なので、これを回答として追加したいと思います。 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)})
22
loki

列タイプの変換を実現するより一般的な方法は次のとおりです。

すべてのfactor列をcharacter列に変換する場合、たとえば、これは1つのパイプを使用して実行できます。

df %>%  mutate_each_( funs(as.character(.)), names( .[,sapply(., is.factor)] ))
4
Nick

mutate_atを含むワンライナーです。

dat %>% mutate_at("l1", factor) %>% mutate_at("l2", as.numeric)
1
nexonvantec

または、converthablarを使用すると、さらに簡単になります。

library(hablar)

dat %>% 
  convert(fct(fac1, fac2, fac3),
          num(dbl1, dbl2, dbl3))

またはtidyselectと組み合わせます:

dat %>% 
  convert(fct(contains("fac")),
          num(contains("dbl")))
0
davsjob