我假设您使用的是“memisc”包中的data.set。如果是这种情况,您应该能够按照?data.set 中的建议将您的data.set 包装在as.data.frame 中来解决您的问题。
这是一个使用 R 附带的 USArrests 数据集的示例。我创建了一个 data.set 版本并尝试运行 princomp 并得到您提到的错误。
这就是 princomp 在原始 data.frame 上的工作方式。
princomp(USArrests, cor = TRUE)
# Call:
# princomp(x = USArrests, cor = TRUE)
#
# Standard deviations:
# Comp.1 Comp.2 Comp.3 Comp.4
# 1.5748783 0.9948694 0.5971291 0.4164494
#
# 4 variables and 50 observations.
现在,让我们创建一个 data.set 版本:
library(memisc)
ARRESTS <- data.set(USArrests)
rownames(ARRESTS) <- rownames(USArrests)
这是你得到错误的地方:
princomp(ARRESTS, cor = TRUE)
# Error in `dimnames<-`(`*tmp*`, value = dimnames) :
# invalid 'dimnames' given for data set
这就是你可以尝试解决的方法:
princomp(as.data.frame(ARRESTS), cor = TRUE)
# Call:
# princomp(x = data.frame(ARRESTS), cor = TRUE)
#
# Standard deviations:
# Comp.1 Comp.2 Comp.3 Comp.4
# 1.5748783 0.9948694 0.5971291 0.4164494
#
# 4 variables and 50 observations.
请注意,我能够修改data.set 的rownames,而您提到在这些情况下您会遇到类似的错误。我的猜测是您试图将它们设置为NULL,这是行不通的。来自?dimnames的“注意”部分:
设置dimnames的组件,例如dimnames(A)[[1]] <- value是一种常见的范例,但请注意,如果分配的值是NULL,它将不起作用。请改用rownames,或(照此执行)操作整个 dimnames 列表。