2010-12-13 47 views
3

私のrecodeのは、いくつかの再コード化は正常に動作していても、df$test"longer object length is not a multiple of shorter object length"警告とNA秒の多くの組み合わせ条件

df$test[(df$1st==(1:3) & df$2nd <= 4)] <- 1 
df$test[(df$1st==(1:3) & df$2nd <= 5)] <- 2 
df$test[(df$1st==(1:3) & df$2nd <= 6)] <- 3 

結果を試みます。
私は何が欠けていますか?どんな助けもありがたい。

DW

答えて

4

私はあなたがdf$1st==(1:3)で達成しようとしているのかわからないのですが、それはおそらく、あなたはそれがないと思う何をしません。 recyclesc(1,2,3)と同じくらい多くの時間はdfと同じくらい長くする必要があります。

あなたはdf$1stは、1と3の間にある場合、あなたはそれを綴るする場合がありますチェックしようとしている場合:

df$1st>=1 & df$1st<=3 
+0

ありがとう、aix!問題は確かに1:3でした。それをスペルアウトしました。参照のために+1 – dw006

+0

+1。 – Marek

5

問題は、この行である:

df$1st==(1:3) 
あなたが使用することができ

%in%

df$1st %in% (1:3) 

異なる長さのベクトルを比較すると警告が表示されます(1:3の長さは3で、df$1stの長さは「あなたが知っているだけ」です。私はあなたがあなたの値が上書きされることを逃したと思うの横に

df$2nd <= 4ので、すべて1と2は、あなたはまた、このような再符号化の問題に対処するためにtransform()を使用して検討する必要があります3.

+0

申し訳ありませんが、上書きは私の例では行われますが、私はあまりにも速くて誤りがあります。 – dw006

1

によって上書きされているにもdf$2nd <= 6です。 transform()は論理インデックス方法よりも低速で実行されますが、コードの目的をより簡単に把握することができます。さまざまな方法の賛否両論の良い議論はhereで見つけることができます。考えてみましょう:

set.seed(42) 
df <- data.frame("first" = sample(1:5, 10e5, TRUE), "second" = sample(4:8, 10e5, TRUE)) 

df <- transform(df 
    , test =  ifelse(first %in% 1:3 & second == 4, 1 
      , ifelse(first %in% 1:3 & second == 5, 2 
      , ifelse(first %in% 1:3 & second == 6, 3, NA))) 
    ) 

第二に、列名1st2ndが構文的に有効な列名ではありません。有効な列名を構成する要素の詳細については、make.names()を参照してください。 data.frameで作業する場合は、check.names引数を使用するか乱用できます。例:

> df <- data.frame("1st" = sample(1:5, 10e5, TRUE), "2nd" = sample(4:8, 10e5, TRUE), check.names = FALSE) 
> colnames(df) 
[1] "1st" "2nd" 
> df <- data.frame("1st" = sample(1:5, 10e5, TRUE), "2nd" = sample(4:8, 10e5, TRUE), check.names = TRUE) 
> colnames(df) 
[1] "X1st" "X2nd" 
関連する問題