已导入以下内容:
d5_17cou <-
read.table("[enter link description here][1]c_all_d5_imp.dat",
header=TRUE, sep="\t", na.strings="", dec=",", row.names=1, comment.char="", strip.white=TRUE)
将“ row.names”设置为1,以便将第一列设置为行名。
我想使用PCAmixdata进行多重对应分析(MCA)。
我将所需变量设置为因子,并设置各种参数:
d5_17cou <- within(d5_17cou, {
a025r <- as.factor(a025r)
a034r <- as.factor(a034r)
a038r <- as.factor(a038r)
a040r <- as.factor(a040r)
a041r <- as.factor(a041r)
a042r <- as.factor(a042r)
c001r <- as.factor(c001r)
c024r <- as.factor(c024r)
c037r <- as.factor(c037r)
charity <- as.factor(charity)
clz.outgr4 <- as.factor(clz.outgr4)
d019r <- as.factor(d019r)
d023r <- as.factor(d023r)
e014r <- as.factor(e014r)
e018r <- as.factor(e018r)
e035r <- as.factor(e035r)
e114r <- as.factor(e114r)
e143r <- as.factor(e143r)
e146r <- as.factor(e146r)
e190rr <- as.factor(e190rr)
f022r <- as.factor(f022r)
f028r <- as.factor(f028r)
f051r <- as.factor(f051r)
f064r <- as.factor(f064r)
f066r <- as.factor(f066r)
f121r <- as.factor(f121r)
helpef <- as.factor(helpef)
jpay <- as.factor(jpay)
prices1 <- as.factor(prices1)
psub.all <- as.factor(psub.all)
})
weight.row <- d5_17cou[,c(4)]
X.quali <- d5_17cou[,c(7:36)]
然后出现MCA命令行:
mca <- PCAmix(X.quanti=NULL,X.quali,ndim=5,weight.col=NULL,weight.row,graph=FALSE)
后跟错误消息: 不允许重复的“行名” 。
这很奇怪,因为该代码几年前曾在完全相同的数据上工作。这次不行。
已在此处浏览了大多数存档的“重复的row.names”错误,在那里尝试了许多解决方案,但仍然会收到相同的错误。这就是说,“尝试查找该线程或该线程”的建议可能无济于事-我需要的是更具体的。
添加
后,更加奇怪row.names=1
今天下午可以使用read.table的子命令,它工作正常-但是晚上我返回任务时使用的是完全相同的脚本。
附有问题的数据。
Data file [Google Drive] 预先感谢。
答案 0 :(得分:1)
我认为问题是由以下事实引起的:行名称是数字,例如199990901000,
,它大于最大整数值.Machine$integer.max
(即2147483647
)。虽然data.frame的行名是字符类型,但可能会在以后的处理步骤中引起问题。
因此,我建议将第一列视为常规数据列,而不是row.names。
下面的代码对我来说很有效,可以读取文件并强制将许多列分解为因数:
library(data.table)
url <- sprintf("https://docs.google.com/uc?id=%s&export=download",
"1NwcvwwaPLWaSmKOuQiVrWAK4iKn9f10S")
d5_17cou <- fread(url, dec = ",", colClasses = list(character = 1L))
cols <- names(d5_17cou)[8:37]
d5_17cou[, (cols) := lapply(.SD, as.factor), .SDcols = cols]
str(d5_17cou)
Classes ‘data.table’ and 'data.frame': 22431 obs. of 39 variables: $ S007 : chr "199905600001" "199905600002" "199905600003" "199905600004" ... $ S003A : int 56 56 56 56 56 56 56 56 56 56 ... $ cou.year : int 561999 561999 561999 561999 561999 561999 561999 561999 561999 561999 ... $ year : int 1999 1999 1999 1999 1999 1999 1999 1999 1999 1999 ... $ s017ay : num 0.692 1.051 1.051 0.752 0.752 ... $ uitem : int 1 2 3 4 5 6 7 8 9 10 ... $ item : int 1 2 3 4 5 6 7 8 9 10 ... $ a025r : Factor w/ 2 levels "1","3": 2 2 2 2 1 1 1 2 1 2 ... $ a034r : Factor w/ 2 levels "1","3": 1 2 1 1 1 2 1 2 1 1 ... $ a038r : Factor w/ 2 levels "1","3": 1 2 2 2 2 1 2 1 2 1 ... $ a040r : Factor w/ 2 levels "1","3": 1 1 1 1 1 1 1 1 1 1 ... $ a041r : Factor w/ 2 levels "1","3": 1 1 1 1 1 1 1 1 1 1 ... $ a042r : Factor w/ 2 levels "1","3": 2 1 2 2 1 1 1 1 1 1 ... $ c001r : Factor w/ 2 levels "1","3": 1 1 2 1 1 1 1 1 1 1 ... $ c024r : Factor w/ 2 levels "1","3": 2 2 2 2 1 2 2 1 2 2 ... $ c037r : Factor w/ 2 levels "1","3": 1 1 1 1 2 2 1 2 2 1 ... $ charity : Factor w/ 2 levels "1","3": 1 1 2 1 1 1 1 2 2 2 ... $ clz.outgr4: Factor w/ 2 levels "1","3": 2 1 1 1 1 1 1 2 1 1 ... $ d019r : Factor w/ 2 levels "1","3": 2 2 2 2 2 2 2 2 2 2 ... $ d023r : Factor w/ 2 levels "1","3": 2 2 1 1 2 2 2 2 2 2 ... $ e014r : Factor w/ 2 levels "1","3": 1 2 1 1 2 2 2 2 2 2 ... $ e018r : Factor w/ 2 levels "1","3": 2 2 2 2 1 1 1 2 2 1 ... $ e035r : Factor w/ 2 levels "1","3": 2 2 1 2 2 1 1 2 2 2 ... $ e114r : Factor w/ 2 levels "1","3": 2 1 1 1 1 1 1 1 1 1 ... $ e143r : Factor w/ 2 levels "1","3": 2 1 1 2 2 1 1 1 1 2 ... $ e146r : Factor w/ 2 levels "1","3": 1 1 2 1 1 2 1 1 2 1 ... $ e190rr : Factor w/ 2 levels "1","3": 2 1 2 2 2 1 2 2 2 2 ... $ f022r : Factor w/ 2 levels "1","3": 1 1 1 2 1 1 1 1 1 1 ... $ f028r : Factor w/ 2 levels "1","3": 1 2 2 2 2 1 2 1 1 1 ... $ f051r : Factor w/ 2 levels "1","3": 1 2 2 2 2 1 1 2 1 1 ... $ f064r : Factor w/ 2 levels "1","3": 1 2 2 2 1 1 2 2 2 1 ... $ f066r : Factor w/ 2 levels "1","3": 1 2 2 2 2 1 2 2 2 2 ... $ f121r : Factor w/ 2 levels "1","3": 1 2 2 1 1 2 2 1 2 2 ... $ helpef : Factor w/ 2 levels "1","3": 1 2 2 2 2 2 2 2 2 2 ... $ jpay : Factor w/ 2 levels "1","3": 1 1 1 1 1 1 1 1 1 1 ... $ prices1 : Factor w/ 2 levels "1","3": 1 1 1 1 1 1 1 1 1 1 ... $ psub.all : Factor w/ 2 levels "1","3": 2 1 1 1 1 2 1 2 2 1 ... $ oriend : int 1 1 1 1 1 1 1 1 1 1 ... $ dupl : int 0 0 0 0 0 0 0 0 0 0 ... - attr(*, ".internal.selfref")=<externalptr>
请注意,第一列S007
明确地作为字符列读入(否则fread()
使用int64
),并且现在是数据集的一部分。因此,所有后续列的编号都会更改。
顺便说一句,fread()
比read.table()
快得多。