2

いくつかのデータから始めましょう。

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

親愛なる親愛なる私--私たちは注意しなければなりませんね。

4

1 に答える 1