Итерация данных в R - PullRequest
       7

Итерация данных в R

0 голосов
/ 11 октября 2018

(впервые я публикую здесь !! Прошел через весь форум, но не смог найти решения)

Я пытаюсь перебрать кадр данных (матрица [846: 19]) иидентифицировать объекты, которые лежат на 3 stDev от среднего.

Я определил значения:

r <- (mapply(v, FUN = sd)*3 + mapply(v, FUN = mean))

Однако, когда я пытаюсь перебрать df (названный 'v')

    for (i in c(1:19)){
      for (j in c(1:19)){
        out[i] <- which(v[[j]]> r[j])
        }
       }

Я получаю сообщение об ошибке

Error in out[i] <- which(v[[j]] > r[j]) : replacement has length zero

Примечание: когда я делаю это вручную (т.е.)

which(v$Rad.Ra>r[5])

, это работает!: o

любая помощь высоко ценится!:)

1 Ответ

0 голосов
/ 11 октября 2018

Вам не нужны циклы for, чтобы выполнить то, что вы описываете в вопросе.
Я буду использовать colMeans, чтобы получить значения в столбце, и apply, чтобы получить стандартные ошибки.Большая часть кода, который следует, векторизована, R способ решения проблем.

Сначала пример набора данных, поскольку вы не опубликовали ни одного.

set.seed(3623)
v <- matrix(rnorm(846*19), ncol = 19)

Теперь проблема.

r <- colMeans(v) + apply(v, 2, sd)*3
w <- which(t(apply(v, 1, `>`, r)), arr.ind = TRUE)

Если вам нужна матрица со строками и столбцами, гдезначения больше 3 стандартных ошибок, матрица w содержит эти значения.

head(w)
#     row col
#[1,] 647   1
#[2,] 124   4
#[3,] 523   4
#[4,] 631   4
#[5,] 775   5
#[6,] 607   6

Если вам нужен список только с номерами строк, split приведенная выше матрица по столбцам.

split(w[, 1], w[, 2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...