Ошибка R при использовании cbind () для data.frame () в цикле for - PullRequest
1 голос
/ 29 марта 2012
d <- data.frame(stringsAsFactors=F)

for (i in 1:ncol(data)) { d <- cbind(d,data[,i])}

Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 0, 132680

Почему я получаю сообщение об ошибке выше?

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Возможно, именно по той причине, что R сказал вам, что все пошло не так: два элемента, которые вы пытаетесь cbind вместе, имеют разное количество строк.

Ваш фрейм данных d имеет emtpy и поэтому содержит 0 строк. Очевидно, ваш фрейм данных data (кстати, вы предоставили нам нулевую информацию) содержит 132680 строк.

Возможно, есть лучший способ сделать то, что вы пытаетесь (cbind использование столбцов в цикле for часто не очень оптимально), но трудно предложить решение без дополнительных подробностей.

0 голосов
/ 30 марта 2012

Возможно взломать решение в соответствии с тем, что у вас есть выше, но вы, вероятно, не хотите. Какова ваша цель здесь?

d <- data.frame(matrix(ncol=0,nrow=5),stringsAsFactors=FALSE)
set.seed(101)
dat <- matrix(sample(LETTERS,replace=TRUE,size=10),ncol=2)
for (i in 1:ncol(dat)) { d <- cbind(d,dat[,i])}
d2 <- as.data.frame(dat,stringsAsFactors=FALSE)

В этом конкретном примере dat представляет собой матрицу character; d - это фрейм данных с двумя factor столбцами ( примечание , что stringsAsFactors=FALSE не не устанавливает атрибут фрейма данных, поэтому ваши последующие вызовы cbind() вызывают преобразование в любом случае фактор!); и d2 возможно (???) то, что вы хотели, исходный набор данных преобразован в фрейм данных ...

> str(dat)
 chr [1:5, 1:2] "J" "B" "S" "R" "G" "H" "P" "I" "Q" "O"
> str(d)
'data.frame':   5 obs. of  2 variables:
 $ dat[, i]: Factor w/ 5 levels "B","G","J","R",..: 3 1 5 4 2
 $ dat[, i]: Factor w/ 5 levels "H","I","O","P",..: 1 4 2 5 3
> str(d2)
'data.frame':   5 obs. of  2 variables:
 $ V1: chr  "J" "B" "S" "R" ...
 $ V2: chr  "H" "P" "I" "Q" ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...