在 R 中计算中位数的错误

Errors by calculating median in R

我只想计算 table 中所有值的 mean/median。我尝试了几个函数,但似乎没有任何效果,我总是收到 'Argument is not nummeric or Logical: returning NA' 或“无法强制对象键入 'double'.

之类的错误

我有一个由 11 列组成的 table。我的数据中有几个 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 的新手,非常感谢您的帮助!

有一个错误。

您正在计算数据框上的 mean/median。

您必须使用 $ 符号对每个变量进行计算。

类似这样。

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 存储均值。

使用您提供的数据,您可以使用 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

I already have the mean/median of each column. Now I Need it from all values in my dataframe.

据推测,这意味着除了第一列(这是一个因子列)之外的所有列的平均值。

这样做的步骤是:

子集 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.frame 作为输入外。我使用 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.rm = TRUE处理NA值):

mean(unlist(WDB1[,-1]), na.rm = TRUE)
#[1] 12.2549