1. ホーム
  2. r

[解決済み] 変数に無効な型(リスト)がある

2022-02-07 09:09:46

質問

Rでアノバモデルを実行しようとしています。3行と12列を含むデータファイルがあります。それぞれの行は、説明変数の特定のレベルのデータです。セル [i,j] は、レベル i の j番目の応答です。ファイルは、拡張子 ".dat" です。私は、3×12のオリジナルのデータフレームの代わりに、36×2のデータフレームを取得してアノバ・モデルを実行するために、次のRコードを実行しています。

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)

しかし、そこからアノバモデルを取り出そうとすると、無効なリスト型エラーが発生します。

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)