いくつかのデータから始めましょう。
set.seed(0)
data <- data.frame('Group' = rep(c('Control', 'Disease'), 10),
'SV_mL' = rnorm(20),
'CO_L' = rnorm(20))
SV_mL
ここで、関心のある 2 つの変数から因数を作成しましょうCO_L
。
var <- as.factor(colnames(data)[colnames(data) != 'Group'])
SV_mL
最初に文字に変換するかどうかに関係なく、作品に基づいたサブセット化:
mean(data[data$Group == 'Control',var[1]]) # 0.2077689
mean(data[data$Group == 'Control',as.character(var[1])]) # 0.2077689
ただし、に基づくサブセット化CO_L
は、最初に文字に変換した場合にのみ機能します。
mean(data[data$Group == 'Control',var[2]]) # NA
mean(data[data$Group == 'Control',as.character(var[2])]) # 0.194133
を返す行でNA
、次の警告が表示されます。
Warning message: argument is not numeric or logical: returning NA
ファクターを使用してデータフレームをサブセット化する前に、ファクターを文字に変換することで問題を回避できることを理解しています。しかし、なぜこれが起こっているのか、特に、ある要因では発生するのに別の要因では発生しない理由を理解したいと思います.
この投稿に遭遇した人への警告。
以下の回答のおかげで、因子に基づいてデータフレームをサブセット化しようとすると、その因子の数値表現が使用されることがわかりました。この場合、 の数値表現SV_mL
は 2 で、 ofCO_L
は 1 でした (デフォルトのアルファベット順に基づく)。たまたまデータフレームの最初の列が要因だったので、エラーが発生しました。たまたま 2 番目の列が だったのでSV_mL
、「幸運にも」正しい答えを得ることができました。
これが別の方法で設定されていたとしましょう。
set.seed(0)
data <- data.frame('Group' = rep(c('Control', 'Disease'), 10),
'X' = rnorm(20),
'SV_mL' = rnorm(20),
'CO_L' = rnorm(20))
var <- as.factor(colnames(data)[colnames(data) != 'Group'])
この場合、X
が最初の因子ですが、その数値表現は3
です。したがって、因子表現に基づいてサブセット化すると、間違った列の平均が得られます。
mean(data[data$Group == 'Control',var[1]]) # 0.194133
mean(data[data$Group == 'Control','X']) # 0.2077689
親愛なる親愛なる私--私たちは注意しなければなりませんね。