我想在R中运行anova模型 . 我有一个包含3行12列的数据文件 . 每行是解释变量的特定级别的数据 . Cell [i,j]是级别i的第j个响应 . 该文件是“.dat”扩展名 . 我正在运行以下R代码以尝试获取36 x 2数据帧来运行anova模型而不是3 x 12原始数据框:
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(数据)结果:
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
2 回答
tl;dr 数据帧行是列表,而不是数字向量 . 当你
read.table()
得到一个数据框(所以构建一个矩阵,就像我之前做的那样,不会复制问题) .事实上,这是一个列表,而不是数字向量,这是一个问题 . 有多种方法可以解决这个问题 . 最简单的是
unlist()
:来自
lm
或其他基于公式的函数的错误消息invalid type (list) for variable x
通常表示变量x
正在期望一个向量,而是一个列表 . 用于调试错误的标准模型是检查str(data_frame_name$x)
的结果(其中data_frame_name
是包含x的数据框) . 通常,您会发现x
不是您期望的数据类型 .