我想创建一个循环,按行移动三个值并忽略缺失(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
答案 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
我不喜欢双重收集步骤,肯定会有一些改进。但它给出了行的平均值。