Rでanovaモデルを実行しようとしています。3行12列のデータファイルがあります。各行は、説明変数の特定のレベルのデータです。セル[i、j]は、レベルiのj番目の応答です。ファイルは「.dat」拡張子です。次のRコードを実行して、3 x 12の元のデータフレームではなく、36 x 2のデータフレームを取得してanovaモデルを実行しようとしています。
data <- read.table("usedcar.dat", row.names = 1)
young <- data[1,]
med <- data[2,]
old <- data[3,]
Price <- c(young, med, old)
Age <- as.factor(c(rep(1,12), rep(2,12), rep(3,12)))
data <- cbind(Age, Price)
data <- as.data.frame(data)
しかし、anovaモデルを取得しようとすると、無効なリストタイプエラーが表示されます。
m1 <- aov(Price ~ Age, data = data)
Error in model.frame.default(formula = Price ~ Age, data = data, drop.unused.levels = TRUE) : invalid type (list) for variable 'Price'
ここで何が間違っていますか?
これが役立つ場合のランダム行列は次のとおりです。
replicate(12, rnorm(3))
Str(data)の結果は次のとおりです。
str(data)
'data.frame': 36 obs. of 2 variables:
$ Age :List of 36
..$ 1 : int 1
..$ 2 : int 1
..$ 3 : int 1
...
..$ 36: int 3
$ Price:List of 36
..$ 1 : int 2300
...
..$ 36: int 2075
tl; drデータフレームの行はリストであり、数値ベクトルではありません。 read.table()
を実行すると、データフレームが取得されます(そのため、以前に行ったように行列を作成しても問題は再現されません)。
_data <- as.data.frame(matrix(rnorm(36),nrow=3))
young <- data[1,]; med <- data[2,]; old <- data[3,]
Price <- c(young, med, old)
str(Price)
## ## List of 36
## ## $ V1 : num 0.648
## ## $ V2 : num 0.157
## ## ...
_
これが数値ベクトルではなくリストであることは問題です。これを処理するさまざまな方法があります。最も簡単なのはunlist()
です:
_dd <- data.frame(Age,Price=unlist(Price))
aov(Price~Age,dd)
_