2017-03-13 6 views
1

関数relevelが指定されたレベルを最初に設定することがわかっています。指定されたレベルを最後に設定する組み込み関数があるかどうかを知りたい。そうでない場合、そのような関数を書く効率的な方法は何ですか?因子のレベルを最後に設定する

答えて

3

組み込み関数はありません。

lastlevel = function(f, last) { 
    if (!is.factor(f)) stop("f must be a factor") 
    orig_levels = levels(f) 
    if (! last %in% orig_levels) stop("last must be a level of f") 
    new_levels = c(setdiff(orig_levels, last), last) 
    factor(f, levels = new_levels) 
} 

x = factor(c("a", "b", "c")) 
> lastlevel(x, "a") 
[1] a b c 
Levels: b c a 
> lastlevel(x, "b") 
[1] a b c 
Levels: a c b 
> lastlevel(x, "c") 
[1] a b c 
Levels: a b c 
> lastlevel(x, "d") 
Error in lastlevel(x, "d") : last must be a level of f 

私はstats:::relevel.factorに小さな変更を作ることができたとき、私はちょうど、そのアウト書いたので、私は少し愚かな感じ:あなたはこのようにそれを行うことができます。 relevelから適応溶液は次のようになり:

lastlevel = function (f, last, ...) { 
    if (!is.factor(f)) stop("f must be a factor") 
    lev <- levels(x) 
    if (length(last) != 1L) 
     stop("'last' must be of length one") 
    if (is.character(last)) 
     last <- match(last, lev) 
    if (is.na(last)) 
     stop("'last' must be an existing level") 
    nlev <- length(lev) 
    if (last < 1 || last > nlev) 
     stop(gettextf("last = %d must be in 1L:%d", last, nlev), 
      domain = NA) 
    factor(x, levels = lev[c(last, seq_along(lev)[-last])]) 
} 

それはさらにいくつかの入力をチェックし、また、(例えば、last = 2が最後に第二レベルを移動する)の数値を受け付けます。

+1

30秒で私を倒す! –

2

パッケージforcatsにはこれをきれいにする機能があります。

f <- gl(2, 1, labels = c("b", "a")) 

forcats::fct_relevel(f, "b", after = Inf) 

#> [1] b a 
#> Levels: a b 
関連する問題