无效类型(列表)的变量。

13

我正在尝试在R中运行一个方差分析模型。我有一个包含3行和12列的数据文件。每一行都是解释变量特定水平的数据。第[i,j]个单元格是i水平j响应的值。该文件扩展名为".dat"。我正在使用以下R代码尝试获取一个36x2数据框,以代替原始的3x12数据框进行方差分析模型:

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

如果您向模型提供了一个“data”参数,那么在公式中不应该使用子集($):aov(Price ~ Age, data = data) - alistaire
在aov(Price~Age,data=data)中出现了相同的错误 :( - nbk
鉴于错误,我会看一下 str(data);你的切割似乎把 Price 留成了一个列表列。 - alistaire
不要使用 cbind/as.data.frame,请使用 data <- data.frame(Age, Price) - Rui Barradas
@Rui 如果我使用 data<-data.frame(Age,Price) ,我会得到一个 36X36 的数据框... - nbk
显示剩余3条评论
2个回答

24

简短概述:数据框的行是列表,而不是数值向量。当你使用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)

我认为问题与我从.dat文件中将数据读入数据框有关? - nbk
1
unlist() 可能需要分别应用于每个列。当我将其应用于整个数据框时,它将数据框转换为一个长向量。 - Sander Heinsalu

8

当你在使用lm或其他基于公式的函数时,如果出现错误信息invalid type (list) for variable x,通常意味着变量x期望一个向量,但实际上是一个列表。调试此错误的标准模型是检查str(data_frame_name$x)的结果(其中data_frame_name是包含x的数据框)。通常情况下,你会发现x不是你期望的数据类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接