Вычислить медиану на столбец в цикле - PullRequest
0 голосов
/ 21 мая 2018

У меня есть этот цикл для вычисления среднего значения для каждого столбца, который работает.

for (i in 1:length(DF1)) {     
    tempA <- DF1[i]                                 # save column of DF1 onto temp variable 
    names(tempA) <- 'word'                          # label temp variable for inner_join function
    DF2 <- inner_join(tempA, DF0, by='word')        # match words with numeric value from look-up DF0
    tempB <- as.data.frame(t(colMeans(DF2[-1])))    # compute mean of column
    DF3<- rbind(tempB, DF3)                         # save results togther
}

Скрипт использует пакет dplyr для inner_join.

  • DF0 - это справочная база данных с 3 столбцами ( слово, значение1, значение2, значение3 ).
  • DF 1 - это текстовые данные с одним словомза клетку.
  • DF3 - это выход.

Теперь я хочу вычислить медиану вместо среднего.Это казалось достаточно простым с функцией colMedians из 'robustbase ', но я не могу заставить работать нижеприведенное.

library(robustbase)

for (i in 1:length(DF1)) {     
    tempA <- DF1[i]
    names(tempA) <- 'word'
    DF2 <- inner_join(tempA, DF0, by='word')
    tempB <- as.data.frame(t(colMedians(DF2[-1])))
    DF3<- rbind(tempB, DF3) 
}

Сообщение об ошибке гласит:

Ошибка в colMedians (tog [-1]): аргумент 'x' должен быть матрицей.

Я пытался отформатировать DF2 как матрицу до функции colMedians, но все равно получаю сообщение об ошибке:

Ошибка в colMedians (tog [-1]): Аргумент 'x' долженбудь матрицей.

Я не понимаю, что здесь происходит.Спасибо за помощь!

Рад предоставить примеры данных и отслеживание ошибок, но стараюсь сделать их максимально четкими и простыми.

Ответы [ 2 ]

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

Согласно комментарию ОП, проблема решена следующим образом.
Я добавил вызов library(dplyr).
Мой вклад был colMedians(data.matrix(DF2[-1]), na.rm = TRUE).

library(robustbase)
library(dplyr)

for (i in 1:length(DF1)) {     
    tempA <- DF1[i]
    names(tempA) <- 'word'
    DF2 <- inner_join(tempA, DF0, by='word')
    tempB <- colMedians(data.matrix(DF2[-1]), na.rm = TRUE)
    DF3 <- rbind(tempB, DF3) 
}
0 голосов
/ 22 мая 2018

Наткнулся на этот ответ , который помог мне исправить цикл следующим образом:

DF3Mean <- data.frame()                         # instantiate dataframe 
DF4Median <- data.frame(                        # instantiate dataframe

for (i in 1:length(DF1)) {     
tempA <- DF1[i]                                 # save column of DF1 onto temp variable 
names(tempA) <- 'word'                          # label temp variable for inner_join function
DF2 <- inner_join(tempA, DF0, by='word')        # match words with numeric value from look-up DF0
tempMean <- as.data.frame(t(colMeans(DF2[-1]))) # compute mean of column
DF3Mean <- rbind(tempMean, DF3Mean)             # save results togther
tempMedian <- apply(DF2[ ,2:4], 2, median)      #compute mean for columns 2,3, and 4 
DF4Median <- rbind(tempMedian, DF4Median)       # save results togther
}

Полагаю, я был слишком зациклен на функции colMedian.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...