R中的元素平均

px9o7tmv  于 2023-05-11  发布在  其他
关注(0)|答案(4)|浏览(95)

在R中,我有两个向量:

a <- c(1, 2, 3, 4)
b <- c(NA, 6, 7, 8)

我如何找到两个向量的元素平均值,去除NA,没有循环?也就是我想得到

(1, 4, 5, 6)

我知道函数mean(),我知道参数na.rm = 1。但我不知道怎么把事情联系起来。可以肯定的是,在现实中,我有成千上万个NA的向量出现在不同的地方,所以任何依赖于维度的解决方案都不起作用。谢谢

bq8i3lrv

bq8i3lrv1#

怎么样:

rowMeans(cbind(a, b), na.rm=TRUE)

colMeans(rbind(a, b), na.rm=TRUE)
jdzmm42g

jdzmm42g2#

我不太清楚你想要什么,但是

apply(rbind(a,b),2,mean,na.rm = TRUE)

做你想做的事

sz81bmfz

sz81bmfz3#

tidyverse解决方案使用purrr

library(purrr)
a <- c(1, 2, 3, 4)
b <- c(NA, 6, 7, 8)

# expected:
c(1, 4, 5, 6) 
#> [1] 1 4 5 6

# actual:
map2_dbl(a,b, ~mean(c(.x,.y), na.rm=T)) # actual
#> [1] 1 4 5 6

对于任意数量的向量:

>  pmap_dbl(list(a,b, a, b), compose(partial(mean, na.rm = T), c))
 [1] 1 4 5 6
92vpleto

92vpleto4#

另一个选项是collapse::fmean,它默认为矩阵的列平均值和na.rm = TRUE

fmean(rbind(a, b))
#[1] 1 4 5 6

基准

向量ab(长度= 4):

microbenchmark::microbenchmark(
  collapse = fmean(rbind(a, b)),
  rowMeans = rowMeans(cbind(a, b), na.rm=TRUE),
  colMeans = colMeans(rbind(a, b), na.rm=TRUE),
  purrr = purrr::map2_dbl(a,b, ~mean(c(.x,.y), na.rm=T)),
  apply = apply(rbind(a,b),2,mean,na.rm = TRUE)
)

# Unit: microseconds
#      expr    min       lq      mean   median       uq      max neval
#  collapse  6.501   7.9020  10.72705   9.7010  10.8010   56.101   100
#  rowMeans  4.601   6.0505   9.21504   7.8010   9.4515   28.102   100
#  colMeans  4.700   5.7010   7.76410   6.8515   8.2015   27.301   100
#     purrr 94.101 104.4505 140.36694 108.8010 121.9510 2120.901   100
#     apply 50.301  55.1010  65.37305  59.9005  65.6510  156.700   100

大向量(大小1e6):

a = sample(1e6)
b = sample(1e6)

# Unit: milliseconds
#      expr       min        lq     mean    median       uq     max neval
#  collapse  8.384401  9.621752 13.02568 10.160101 18.83060 34.2746   100
#  rowMeans 18.504201 21.513251 27.88083 23.509051 31.28925 94.2124   100
#  colMeans  8.117601  9.344551 12.69392  9.897702 12.50430 54.1703   100

相关问题