cbind () для матриц разной длины - PullRequest
0 голосов
/ 30 мая 2018

Я пишу цикл for, который преобразует выходные данные summary() для набора векторов в матрицу, такую ​​как foo, ниже:

            introA   introB  introC  helpA    helpB   helpC
Min.        1        1        4       4       2       4
1st Qu.     5        5        5       5       4       5
Median      5        5        5       5       4       5
Mean        4.83     4.71     4.96    4.89    4.02    4.77
3rd Qu.     5        5        5       5       5       5
Max.        5        5        5       5       5       5
NA's        2        5        0       3       0       2

Обратите внимание, что introC и helpBимеют нули в строке NA, и это summary() НЕ производит это по умолчанию - если вы вызываете summary() для вектора без значений NA, результатом будет объект с длиной 6 вместо 7.

Мой цикл for инициализирует пустую матрицу x, присваивает результат summary для каждого числового вектора в кадре данных x и привязывает каждый x к большему объекту y.Это работает на всех фреймах данных, где у каждого вектора нет пропущенных значений или у всех есть.

Когда у некоторых векторов есть пропущенные значения, а у других нет, я написал этот обходной путь:

x <- matrix(NA,nrow=7,ncol=1)
y <- NULL

for(i in 1:ncol(foo)){

  if(length(summary(foo[,i]==6))){

    x <- as.matrix(c(summary(foo[,i]), 0))
    rownames(x) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.", "NA's")

  }else if(length(summary(foo[,i]==7))){

    x <- as.matrix(summary(foo[,i]))
    rownames(x) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.", "NA's")

  }

  y <- cbind(y,x)
  x <- matrix(NA,nrow=7,ncol=1)
}

Здесь я проверяю, является ли summary() вектора длины 6 или 7, и я добавляю строку, когда это не раньше, связывая результаты вместе.Вне моей петли это работает.По какой-то причине я получаю следующую ошибку при попытке запустить это в цикле:

Error in dimnames(x) <- dn : 
  length of 'dimnames' [1] not equal to array extent

Есть идеи о том, как моя длина не может быть равна экстенту массива?Я проверил длину summary() для всех векторов в foo;все имеют длину 6 или 7.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Ответ: потому что мои length() вызовы были написаны неправильно, а условие, которое я хотел указать, никогда не выполнялось.Я исправил их следующим образом ...

if(length(summary(tueAn[,i]))==6)

и

if(length(summary(tueAn[,i]))==7)

и все встало на свои места.Уф.

0 голосов
/ 30 мая 2018

Сначала мы помещаем столбцы набора данных iris как векторы в среде, и мы помещаем несколько NA в один из них:

list2env(iris[1:4],envir = globalenv())
Sepal.Length[1:3] <- NA

Затем:

sapply(list(Sepal.Length = Sepal.Length,Sepal.Width = Sepal.Width,Petal.Length = Petal.Length,Petal.Width = Petal.Width),
       function(x) { x <- summary(x); if (is.na(x["NA's"])) x["NA's"] <- 0;x})

#         Sepal.Length Sepal.Width Petal.Length Petal.Width
# Min.        4.300000    2.000000        1.000    0.100000
# 1st Qu.     5.100000    2.800000        1.600    0.300000
# Median      5.800000    3.000000        4.350    1.300000
# Mean        5.862585    3.057333        3.758    1.199333
# 3rd Qu.     6.400000    3.300000        5.100    1.800000
# Max.        7.900000    4.400000        6.900    2.500000
# NA's        3.000000    0.000000        0.000    0.000000
...