不允许重复的“ row.names”-仍然杀死了我

时间:2018-10-03 01:07:35

标签: r

已导入以下内容:

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] 预先感谢。

1 个答案:

答案 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()快得多。