我收到了一个data.frame ABC_Score
。
ABC_Score <- data.frame(Level = c("A", "A", "A", "B", "B", "C", "C",
"C", "C"), result = c(2, 3, 3, 7, 9, 18, 20, 17, 20))
我需要的是result
每Level
的移动平均值。
目前,我有以下脚本的移动平均线。
install.packages("TTR")
library(TTR)
`ABC_Score$MA` <- runMean(ABC_Score$result, 2)
Level result MA
1 A 2 NA
2 A 3 2.5
3 A 3 3.0
4 B 7 5.0
5 B 9 8.0
6 C 18 13.5
7 C 20 19.0
8 C 17 18.5
9 C 20 18.5
但是在这里我需要指定计算移动平均线的行数(result
)。在此示例中2
不正确,因为来自不同results
的{{1}}现在在移动平均线中混合。
如何根据Levels
每result
?
答案 0 :(得分:5)
您可以使用group-by
中的mutate
和dplyr
。
library(TTR)
library(dplyr)
ABC_Score <- data.frame(
Level = c("A", "A", "A", "B", "B", "C", "C", "C", "C"),
result = c(2, 3, 3, 7, 9, 18, 20, 17, 20))
ABC_Score %>% group_by(Level) %>% mutate(ra = runMean(result, 2))
# A tibble: 9 x 3
# Groups: Level [3]
Level result ra
<fctr> <dbl> <dbl>
1 A 2 NA
2 A 3 2.5
3 A 3 3.0
4 B 7 NA
5 B 9 8.0
6 C 18 NA
7 C 20 19.0
8 C 17 18.5
9 C 20 18.5
答案 1 :(得分:2)
对具有因子水平的sinbgle向量使用函数是ave函数的作用:
ABC_Score$MA <- with(ABC_Score, ave(result, Level, FUN=function(x)
TTR::runMean(x, n=2)) )
> ABC_Score
Level result MA
1 A 2 NA
2 A 3 2.5
3 A 3 3.0
4 B 7 NA
5 B 9 8.0
6 C 18 NA
7 C 20 19.0
8 C 17 18.5
9 C 20 18.5