在R中,我有两个向量:
a <- c(1, 2, 3, 4) b <- c(NA, 6, 7, 8)
我如何找到两个向量的元素平均值,去除NA,没有循环?也就是我想得到
(1, 4, 5, 6)
我知道函数mean(),我知道参数na.rm = 1。但我不知道怎么把事情联系起来。可以肯定的是,在现实中,我有成千上万个NA的向量出现在不同的地方,所以任何依赖于维度的解决方案都不起作用。谢谢
mean()
na.rm = 1
bq8i3lrv1#
怎么样:
rowMeans(cbind(a, b), na.rm=TRUE)
或
colMeans(rbind(a, b), na.rm=TRUE)
jdzmm42g2#
我不太清楚你想要什么,但是
apply(rbind(a,b),2,mean,na.rm = TRUE)
做你想做的事
sz81bmfz3#
tidyverse解决方案使用purrr:
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
92vpleto4#
另一个选项是collapse::fmean,它默认为矩阵的列平均值和na.rm = TRUE:
collapse::fmean
na.rm = TRUE
fmean(rbind(a, b)) #[1] 1 4 5 6
基准
向量a和b(长度= 4):
a
b
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
4条答案
按热度按时间bq8i3lrv1#
怎么样:
或
jdzmm42g2#
我不太清楚你想要什么,但是
做你想做的事
sz81bmfz3#
tidyverse
解决方案使用purrr
:对于任意数量的向量:
92vpleto4#
另一个选项是
collapse::fmean
,它默认为矩阵的列平均值和na.rm = TRUE
:基准
向量
a
和b
(长度= 4):大向量(大小1e6):