使用行和列说明符计算一式三份的平均值,忽略NA

时间:2018-03-21 22:09:40

标签: r loops mean na

我想创建一个循环,按行移动三个值并忽略缺失(NA)值来计算平均值。

这是我的例子,其中应计算a,b和c值的平均值以及x,y和z的平均值:

df <- data.frame(label=paste0("lab", 1:15), a=1:5, b=6:2, c=25:11,
                                     x=5:1, y=2:6, z=11:25, zz=NA)
df[,2]<-NA
df[1,]<-NA
df

我远非完整的解决方案:

res <- tapply(df[,2:4], df[,5:7], mean, na.rm=F)

预期结果:

head(res,3)
   label  a  b  c  x  y  z zz mean_abc mean_xyz
1   <NA> NA NA NA NA NA NA NA NA NA
2   lab2 NA  5 24  4  3 12 NA 9.7 6.3

2 个答案:

答案 0 :(得分:2)

> df$mean_abc <- rowMeans(df[ , c('a', 'b', 'c')], na.rm = TRUE)
> df
   label  a  b  c  x  y  z zz mean_abc
1   <NA> NA NA NA NA NA NA NA      NaN
2   lab2 NA  5 24  4  3 12 NA     14.5
3   lab3 NA  4 23  3  4 13 NA     13.5
4   lab4 NA  3 22  2  5 14 NA     12.5
5   lab5 NA  2 21  1  6 15 NA     11.5
6   lab6 NA  6 20  5  2 16 NA     13.0
7   lab7 NA  5 19  4  3 17 NA     12.0
8   lab8 NA  4 18  3  4 18 NA     11.0
9   lab9 NA  3 17  2  5 19 NA     10.0
10 lab10 NA  2 16  1  6 20 NA      9.0
11 lab11 NA  6 15  5  2 21 NA     10.5
12 lab12 NA  5 14  4  3 22 NA      9.5
13 lab13 NA  4 13  3  4 23 NA      8.5
14 lab14 NA  3 12  2  5 24 NA      7.5
15 lab15 NA  2 11  1  6 25 NA      6.5

答案 1 :(得分:1)

我承认,到目前为止,并不像@ EDi的答案那样优雅和高效,但这里有一个可能的整齐解决方案(我已将你的数据框命名为'my_dat')

require(dplyr) 
require(tidyr)

my_dat %>% gather(group1, value1, a:c) %>% 
           gather(group2, value2, x:z) %>%
           group_by(label) %>%
           summarise_at(vars(value1, value2), funs(mean), na.rm = TRUE)

# A tibble: 15 x 3
   label value1 value2
   <fct>  <dbl>  <dbl>
 1 lab10   9.00   9.00
 2 lab11  10.5    9.33
 3 lab12   9.50   9.67
 4 lab13   8.50  10.0 
 5 lab14   7.50  10.3 
 6 lab15   6.50  10.7 
 7 lab2   14.5    6.33
 8 lab3   13.5    6.67
 9 lab4   12.5    7.00
10 lab5   11.5    7.33
11 lab6   13.0    7.67
12 lab7   12.0    8.00
13 lab8   11.0    8.33
14 lab9   10.0    8.67
15 <NA>  NaN    NaN   

我不喜欢双重收集步骤,肯定会有一些改进。但它给出了行的平均值。