2016-11-12 3 views
1

同じ行の他の列の値に基づいて列内の値を再コードするレガシーRコードを継承しました。あなたは結果を検査した場合R:因果列を論理的に扱ったデータフレームを誤ってサブセット化する

df <- data.frame(value = c(1, 2, 3, 4, 5, 6), 
       reversed = c("true", "false", 
           "true", "true", 
           "false", "false")) 

str(df) 
#> 'data.frame': 6 obs. of 2 variables: 
#> $ value : num 1 2 3 4 5 6 
#> $ reversed: Factor w/ 2 levels "false","true": 2 1 2 2 1 1 

df$recoded_value <- df$value 
df$recoded_value[df$reversed] <- 7 - df$recoded_value[df$reversed] 

、これは予期しない結果を生成しますので、同様に、現実には、これらの値は、(文字列がに変換される)実際因子であったとき、それは誤ってブール値であると考えられていました。 df[2, "recoded_value"]は5ですが、その目的は2です。さらに、df[3, "recoded_value"]は3ですが、その目的は4です。

私はここで何が起こっているのか理解したいと思います。私の最初の仮説は、Rが1つの因子レベルをTRUEと扱い、もう1つがFALSEであるというものでした。

df[c(1,3), ] 
#> value reversed recoded_value 
#> 1  1  true    6 
#> 3  3  true    3 

df[c(2,5), ] 
#> value reversed recoded_value 
#> 2  2 false    5 
#> 5  5 false    5 

はここで何が起こっている:同じ因子レベルがは同様に処理されていないので、しかし、これは明らかにそうではありませんか?

明確にする:問題の解決には興味がありません。私は目的の結果を得るためにコードを修正する方法を知っています。私は理解したい:

  1. なぜこのコードはまったく機能するのですか?因子列に基づいてどのようにサブセット化できますか? `[`はこれを許可することも何ですか?
  2. 同じ値(、つまり、同じレベルの因子)のものが異なる扱いを受けるのはなぜですか?

答えて

1

それは後に記載されているように、reversedfactorなくlogicalベクトルです。 Rでは、TRUE/FALSE値は論理的であるため、我々は(OPのコードから)予期しない出力を持っている理由についてlogicalベクトル

df$reversed <- df$reversed=="true" 

に変換し、

df$reversed 
#[1] true false true true false false 
#Levels: false true 

levelsはアルファベット順になっていますfactorの格納モードはinteger、つまり

です。私たちは「逆転」を使用して「recoded_value」をサブセットする場合、出力の最初の値が「recoded_value」と第2の第一の第2の観察である。すなわちだから、それは数値インデックス

df$recoded_value[df$reversed] 
#[1] 2 1 2 2 1 1 

に基づいてサブセットのでしょう

観察など、私たちは正しい論理インデックスを使用する代わりに、場合

df$recoded_value[df$reversed=="true"] 
#[1] 1 3 4 

はのは、これを変更「逆転」でどのように動作するか確認してみましょう

df$reversed <- df$reversed=="true" 
df$recoded_value[df$reversed] <- 7 - df$recoded_value[df$reversed] 
df[c(1,3), ] 
# value reversed recoded_value 
#1  1  TRUE    6 
#3  3  TRUE    4 
df[c(2,5),] 
# value reversed recoded_value 
#2  2 FALSE    2 
#5  5 FALSE    5 
+1

答えをありがとう!なぜ私はこれを以前に気づかなかったのか分かりません。私は、最小限の例を構築するときに貧しい数字を選んだと思う。行番号と同じ値を選んではいけません。 ':-p'とにかく、ありがとう。 +1 –

関連する問題