2015-10-12 5 views
5

rowwisemutateをNA値を返す関数で使用しようとしましたが、エラーが発生しています。この不自然な例(明らかに行方向の場合ではないですが、エラーを示している)考えてみましょう:dplyr :: rowwise、mutate、およびNAエラー

library(dplyr) 
data.frame(k=rnorm(10)) %>% mutate(l = ifelse(k > 0, 1, NA)) 

      k l 
1 -1.40223573 NA 
2 1.47581873 1 
3 0.35938746 1 
4 0.87240448 1 
5 -0.61991535 NA 
6 -1.88152820 NA 
7 0.25837350 1 
8 -0.02250385 NA 
9 0.92757943 1 
10 0.49023792 1 

をしかし、これは誤りなります:

をこの作品

library(dplyr) 
data.frame(k=rnorm(10)) %>% rowwise() %>% mutate(l = ifelse(k > 0, 1, NA)) 

Error: incompatible types, expecting a numeric vector 

答えて

5

注:私はこの回答の結果の誤りに関してgithub issue #1448を提出しました。

更新日2010年10月29日:rowwise()でこのバグが修正されました。詳細については上記のリンクを確認してください。


まず、これを行単位の操作にする必要はありません。

エラーが発生する限り、NAは論理型です。この行単位の操作でifelse()への呼び出しでNA_real_を使用する必要があります。または、ベン・ボルカーが以下のコメントに注記しているように、ifelse()as.numeric()で包むことができます。

data.frame(k = rnorm(10)) %>% 
    rowwise() %>% 
    mutate(l = ifelse(k > 0, 1, NA_real_)) 
# Source: local data frame [10 x 2] 
# Groups: <by row> 
# 
#    k  l 
#   (dbl) (dbl) 
# 1 -1.7105691140 NA 
# 2 -0.0702667985 NA 
# 3 -0.5505724960 NA 
# 4 -0.7444839870 NA 
# 5 -0.0005646999 NA 
# 6 -0.3702584194 NA 
# 7 0.2596026787  1 
# 8 0.4149810662 NA <-- error here pointed out by David A (see comments) 
# 9 -0.4698540654 NA 
# 10 1.0961705022  1 

あなたも

mutate(l = ifelse(k > 0, 1L, NA_integer_)) 

のように、整数を使用することができますしかし、あなたはそれが思わ行方向OPSでの論理名および実数/整数を混在させることはできません。

+0

@numeric(ifelse(...))も動作します。 –

+0

@BenBolkerそれは行方向であるため、 'mutate(l = if(k> 0)1 else NA_real_)も機能します。おそらく、それは行方向ではありません。 – Frank

+0

ありがとう、私は、ベクトルの中に値を入れるときに値をキャストしないといけない、これの背後にあるいくつかの哲学があるだろうと推測しています(行方向、おそらく?)。 – blindjesse

関連する問題