Ошибки при вычислении медианы в R

Я просто хочу вычислить среднее / медиану всех значений в моей таблице. Я пробовал несколько функций, но, похоже, ничего не работает, я всегда получаю ошибки типа «Аргумент не числовой или логический: возвращение NA» или «объект не может быть принудительно набран для типа double».

У меня есть таблица, состоящая из 11 столбцов. В моих данных есть несколько NA.

Я пробовал следующее:

mean(WDB1, na.rm=TRUE)

Не сработало, поэтому подумал Может быть, as.numeric поможет:

as.numeric(WDB1, na.rm=TRUE)

Я также пытался создать фрейм данных и использовать apply.

Вывод str (WDB1):

'data.frame':   18 obs. of  11 variables:
 $ Artname: Factor w/ 18 levels "Andrena carotonica",..: 11 9 10 7 8 12 15 14 1 3 ...
 $ X1     : int  2 0 7 NA NA NA NA NA NA NA ...
 $ X2     : int  4 1 41 NA NA NA NA NA NA NA ...
 $ X3     : int  27 7 39 5 NA NA NA NA NA NA ...
 $ X4     : int  37 5 32 NA 7 2 NA 1 NA NA ...
 $ X5     : int  38 3 33 2 NA NA NA NA NA NA ...
 $ X6     : int  35 12 33 NA NA NA NA NA NA NA ...
 $ X7     : int  12 4 44 NA NA NA NA NA NA NA ...
 $ X8     : int  12 15 24 NA NA NA NA NA NA NA ...
 $ X9     : int  30 0 39 NA NA NA NA NA NA NA ...
 $ X10    : int  18 2 33 1 NA NA NA NA 1 NA ...

dput (WDB1)

structure(list(Artname = structure(c(11L, 9L, 10L, 7L, 8L, 12L, 
15L, 14L, 1L, 3L, 2L, 4L, 5L, 17L, 13L, 16L, 18L, 6L), .Label = c("Andrena carotonica", 
"Andrena cineraria", "Andrena dorsata", "Andrena flavipes", "Andrena nigriceps", 
"Anthopora plumipes", "Bombus hortorum", "Bombus humilis", "Bombus lapidarius", 
"Bombus lucorum", "Bombus pascuorum", "Bombus pratorium", "Colletes similis", 
"Heriades truncorum", "Lasioglossum punctatissimum", "Lasioglosum lucidulum", 
"Melitta haemorrhoridales", "Sphecodes puncticeps"), class = "factor"),

    X1 = c(2L, 0L, 7L, NA, NA, NA, NA, NA, NA, NA, NA, 1L, NA, 
    2L, 1L, 1L, NA, NA), X2 = c(4L, 1L, 41L, NA, NA, NA, NA, 
    NA, NA, NA, NA, 1L, 1L, NA, NA, NA, 1L, NA), X3 = c(27L, 
    7L, 39L, 5L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA), X4 = c(37L, 5L, 32L, NA, 7L, 2L, NA, 1L, NA, 
    NA, 1L, NA, NA, NA, NA, NA, NA, 3L), X5 = c(38L, 3L, 33L, 
    2L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
    ), X6 = c(35L, 12L, 33L, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, 1L, NA), X7 = c(12L, 4L, 44L, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), X8 = c(12L, 
    15L, 24L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA), X9 = c(30L, 0L, 39L, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA), X10 = c(18L, 2L, 33L, 
    1L, NA, NA, NA, NA, 1L, NA, NA, 1L, 1L, NA, NA, 1L, NA, 1L
    )), class = "data.frame", row.names = c(NA, -18L))

Я новичок в R и очень благодарен за любую помощь!


person jchm    schedule 31.07.2019    source источник
comment
Добро пожаловать в StackOverflow! Прочтите информацию о как задать хороший вопрос и как задать воспроизводимый пример. Это облегчит другим помощь вам.   -  person Sotos    schedule 31.07.2019
comment
Каков результат str(WDB1)? Пожалуйста, добавьте эту информацию в текст вопроса.   -  person Roland    schedule 31.07.2019
comment
Вероятно, в ваших данных есть какие-то строки   -  person David    schedule 31.07.2019
comment
@Roland, я добавил вывод, к сожалению, он не такой упорядоченный, как в окне редактора.   -  person jchm    schedule 31.07.2019
comment
А что бы вы хотели иметь в виду? Строки, столбцы, ...   -  person Roland    schedule 31.07.2019
comment
Поскольку ваши данные очень малы, добавьте вывод dput (WDB1), поскольку это позволяет нам легко воспроизвести его.   -  person Roland    schedule 31.07.2019
comment
В настоящее время вы просите R вычислить среднее / медианное значение кадра данных. Вам нужно среднее / медианное значение каждого столбца / строки / или всех значений, содержащихся в вашем data.frame?   -  person OTStats    schedule 31.07.2019
comment
@OTStats У меня уже есть среднее значение для каждого столбца. Теперь мне это нужно из всех значений в моем фрейме данных.   -  person jchm    schedule 31.07.2019


Ответы (3)


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

Предположительно, это означает среднее значение всех столбцов, кроме первого (факторного столбца).

Шаги для этого:

Подмножество data.frame для удаления первого столбца:

WDB1[,-1]
#   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
#1   2  4 27 37 38 35 12 12 30  18
#2   0  1  7  5  3 12  4 15  0   2
#3   7 41 39 32 33 33 44 24 39  33
#4  NA NA  5 NA  2 NA NA NA NA   1
#5  NA NA NA  7 NA NA NA NA NA  NA
#6  NA NA NA  2 NA NA NA NA NA  NA
#7  NA NA NA NA NA NA NA NA NA  NA
#8  NA NA NA  1 NA NA NA NA NA  NA
#9  NA NA NA NA NA NA NA NA NA   1
#10 NA NA NA NA NA NA NA NA NA  NA
#11 NA NA NA  1 NA NA NA NA NA  NA
#12  1  1 NA NA NA NA NA NA NA   1
#13 NA  1 NA NA NA NA NA NA NA   1
#14  2 NA NA NA NA NA NA NA NA  NA
#15  1 NA NA NA NA NA NA NA NA  NA
#16  1 NA NA NA NA NA NA NA NA   1
#17 NA  1 NA NA NA  1 NA NA NA  NA
#18 NA NA NA  3 NA NA NA NA NA   1

Преобразуйте результат в вектор, потому что mean не использует data.frames в качестве входных данных. Я использую unlist, потому что data.frame - это списки, но вы также можете использовать as.matrix:

unlist(WDB1[,-1])
# X11   X12   X13   X14   X15   X16   X17   X18   X19  X110  X111  X112  X113  X114  X115  X116  X117  X118   X21   X22   X23   X24   X25   X26 
#    2     0     7    NA    NA    NA    NA    NA    NA    NA    NA     1    NA     2     1     1    NA    NA     4     1    41    NA    NA    NA 
#  X27   X28   X29  X210  X211  X212  X213  X214  X215  X216  X217  X218   X31   X32   X33   X34   X35   X36   X37   X38   X39  X310  X311  X312 
#   NA    NA    NA    NA    NA     1     1    NA    NA    NA     1    NA    27     7    39     5    NA    NA    NA    NA    NA    NA    NA    NA 
# X313  X314  X315  X316  X317  X318   X41   X42   X43   X44   X45   X46   X47   X48   X49  X410  X411  X412  X413  X414  X415  X416  X417  X418 
#   NA    NA    NA    NA    NA    NA    37     5    32    NA     7     2    NA     1    NA    NA     1    NA    NA    NA    NA    NA    NA     3 
#  X51   X52   X53   X54   X55   X56   X57   X58   X59  X510  X511  X512  X513  X514  X515  X516  X517  X518   X61   X62   X63   X64   X65   X66 
#   38     3    33     2    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    35    12    33    NA    NA    NA 
#  X67   X68   X69  X610  X611  X612  X613  X614  X615  X616  X617  X618   X71   X72   X73   X74   X75   X76   X77   X78   X79  X710  X711  X712 
#   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA     1    NA    12     4    44    NA    NA    NA    NA    NA    NA    NA    NA    NA 
# X713  X714  X715  X716  X717  X718   X81   X82   X83   X84   X85   X86   X87   X88   X89  X810  X811  X812  X813  X814  X815  X816  X817  X818 
#   NA    NA    NA    NA    NA    NA    12    15    24    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA 
#  X91   X92   X93   X94   X95   X96   X97   X98   X99  X910  X911  X912  X913  X914  X915  X916  X917  X918  X101  X102  X103  X104  X105  X106 
#   30     0    39    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    18     2    33     1    NA    NA 
# X107  X108  X109 X1010 X1011 X1012 X1013 X1014 X1015 X1016 X1017 X1018 
#   NA    NA     1    NA    NA     1     1    NA    NA     1    NA     1 

Передайте вектор в функцию mean (не забудьте обработать значения NA, установив na.rm = TRUE):

mean(unlist(WDB1[,-1]), na.rm = TRUE)
#[1] 12.2549
person Roland    schedule 01.08.2019
comment
Наконец-то это сработало. Спасибо большое за вашу помощь! - person jchm; 02.08.2019

Используя предоставленные вами данные, вы можете использовать dplyr функции для фильтрации числовых столбцов, затем вы можете использовать tidyr, чтобы собрать все столбцы в одну строку, и, наконец, вы можете подвести итоги.

library(dplyr)
library(tidyr)

df %>
  select_if(is.numeric) %>% 
  gather() %>% 
  summarise(median_value = median(value, na.rm = TRUE), 
            mean_value = mean(value, na.rm = TRUE))

#  median_value mean_value
#1            4    12.2549
person OTStats    schedule 31.07.2019
comment
Спасибо, попробовал. Мой результат - просто # 1 NA NA, я пробовал его с 'na.rm = T', но это все еще просто NA. - person jchm; 31.07.2019
comment
Я использовал данные, которые вы предоставили в своем вопросе, и получил 4 и 12,25 для медианы и среднего соответственно. Трудно помочь, не видя ваших реальных данных. - person OTStats; 31.07.2019

Произошла ошибка.

Вы вычисляете среднее / медианное значение по кадру данных.

Вы должны вычислить его по каждой переменной, используя символ $.

Что-то вроде этого.

mydf

Var1 Var2
1     1
1     2
2     3
4     20

Затем, если я хочу получить медианное значение Var1, я пишу median(mydf$Var1)

Чтобы сделать это сразу для всех переменных, используйте цикл for.

vector.median<-c()
vector.mean<-c()
for(i in ncol(mydf)){
vector.median[i]<-median(as.numeric(mydf[,i]),na.rm=TRUE)
vector.mean[i]<-mean(as.numeric(mydf[,i]),na.rm=TRUE)
}

Затем vector.median сохраняет медианы, а vector.mean сохраняет средние.

person Rodrigo Orellana    schedule 31.07.2019
comment
Но разве нет способа просто рассчитать это для всех моих значений? У меня уже есть это для десяти разных переменных, но теперь я хочу объединить медианное / среднее значение из всей таблицы. - person jchm; 31.07.2019
comment
Спасибо, я пробовал это, но я просто получаю результат NA, NA, NA ... - person jchm; 31.07.2019
comment
Ставил na.rm=TRUE? - person Rodrigo Orellana; 31.07.2019
comment
Да. Я также получил новое значение рядом с двумя векторами: i 11L. Может это из-за названий видов в столбце 1? Нужно ли мне их исключать? - person jchm; 31.07.2019
comment
Это означает, что вы работаете с целыми числами, используйте as.numeric. - person Rodrigo Orellana; 31.07.2019
comment
По-прежнему никаких изменений с НА :( - person jchm; 31.07.2019
comment
Я сделал это с вашим фреймом данных, и это сработало, для первой переменной, которую я получил mean=3 и median=2, проверьте свой код, пожалуйста. - person Rodrigo Orellana; 31.07.2019
comment
Я сделал. У меня точно такой же код. Думаю, я что-то напортачил со своей таблицей и названиями видов. Спасибо большое за вашу помощь! Я пытаюсь понять это. - person jchm; 31.07.2019
comment
Да, я ничем не могу вам помочь, больше нет причин получать АН. Попробуйте исключить переменные с символьным классом, если они есть, используйте class функцию по столбцу. - person Rodrigo Orellana; 31.07.2019