2017-08-14 4 views
0

は、次のコードを考えてみましょう:dplyrのdoの文字値を正しく返すには?

foo <- function() { 
    if (runif(1) < 0.5) { 
    return(data.frame(result="low")) 
    } else { 
    return(data.frame(result="high")) 
    } 
} 

df = data.frame(val=c(1,2,3,4,5,6)) 
df %>% group_by(val) %>% do(foo()) 

それはランダムですが、両方とも「低」と「高」の結果が返された場合、あなたはこのようなエラーが表示されます:

Warning messages: 
1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character 
2: In bind_rows_(x, .id) : 
    binding character and factor vector, coercing into character vector 
3: In bind_rows_(x, .id) : 
    binding character and factor vector, coercing into character vector 
4: In bind_rows_(x, .id) : 
    binding character and factor vector, coercing into character vector 
5: In bind_rows_(x, .id) : 
    binding character and factor vector, coercing into character vector 

私は信じています返される最初の値(例えば、「低」)は1つのレベルのファクタに変換され、もう1つのレベルが来ると、それはdplyrの怒りを招く。

警告を回避するためにこの例をコードする適切な方法は何ですか?

編集

foo <- function() { 
    if (runif(1) < 0.5) { 
    return(data.frame(result=factor("low", levels=c("low", "high")))) 
    } else { 
    return(data.frame(result=factor("high", levels=c("low", "high")))) 
    } 
} 

しかし、私は先に時間の因子レベルがわからない場合はどのような:一つの解決策は、このですか?

さらに、基本的には、私は要素ではなく文字ベクトルを返したいと思います。

答えて

2

次のいずれかの

  • 使用stringsAsFactors=FALSEreturn(data.frame(..., stringsAsFactors=FALSE))

または:

  • 使用data_framereturn(data_frame(...))

くださいdata.fr?要因治療の詳細については、ameを参照してください。

+0

あなたは狂ったR天才です。私はstringAsAsactorを100回忘れてしまった。 – dfrankow

関連する問題