R - функция svd() - бесконечные или отсутствующие значения в 'x'

Я постоянно получаю эту ошибку. Я уверен, что в матрице нет нечисловых элементов. Пробовал также вменять матрицу, не получилось.

Может кто знает что за ошибка?

fileUrl <- "https://dl.dropboxusercontent.com/u/76668273/kdd.csv";
download.file(fileUrl,destfile="./kdd.csv",method="curl");
kddtrain <- read.csv("kdd.csv");
kddnumeric <- kddtrain[,sapply(kddtrain,is.numeric)];
kddmatrix <- as.matrix(kddnumeric);
svd1 <- svd(scale(kddmatrix));

person Shubham Saini    schedule 29.01.2014    source источник
comment
В будущем приветствуется небольшой воспроизводимый пример (а не то, что требует загрузки).   -  person Blue Magister    schedule 29.01.2014


Ответы (1)


У вас есть столбцы, состоящие только из нулей. Использование scale в столбце, состоящем из всех нулей, возвращает столбец, состоящий из NaN. Чтобы решить эту проблему, удалите столбцы, в которых у вас все нули (svd ничего нового о них не откроет), или замените столбцы NaN нулями после использования scale.

Воспроизводимый пример:

mat <- matrix(c(1,2,3,0,0,0,2,4,6,5,12,13),nrow = 3)
     # [,1] [,2] [,3] [,4]
# [1,]    1    0    2    5
# [2,]    2    0    4   12
# [3,]    3    0    6   13
scale(mat)
     # [,1] [,2] [,3]       [,4]
# [1,]   -1  NaN   -1 -1.1470787
# [2,]    0  NaN    0  0.4588315
# [3,]    1  NaN    1  0.6882472
# attr(,"scaled:center")
# [1]  2  0  4 10
# attr(,"scaled:scale")
# [1] 1.000000 0.000000 2.000000 4.358899
svd(mat) #fine
svd(scale(mat)) # not fine
person Blue Magister    schedule 29.01.2014
comment
большое спасибо, идеальный ответ. простая строка kddmatrix ‹- kddmatrix[,colSums(kddmatrix != 0) != 0] перед применением svd решила эту проблему. - person Shubham Saini; 29.01.2014