我需要计算表中两个连续值之间的滞后或超前平均值,然后将平均值输出到新列。我可以为这个操作编写一个for循环,但是更愿意避免这种情况,以便代码更灵活。是否可以在dplyr和tidyr中执行此操作?下面是一个示例数据集和所需的结果。提前谢谢。
DATA = data.frame(POO = c(2, 4, 6, 8, 10 , 20))
RESULTS = data.frame(POO = c(2, 4, 6, 8, 10 , 20), YEY = c(0,3,5,7,9,15))
答案 0 :(得分:2)
使用filter
:
DATA$YEY <- filter(DATA$POO, c(1, 1)/2, sides = 1)
# POO YEY
#1 2 NA
#2 4 3
#3 6 5
#4 8 7
#5 10 9
#6 20 15
然后,您可以将NA
替换为0
,但我不明白其背后的逻辑。
请注意,filter
很遗憾被包dplyr屏蔽了。如果您已附加dplyr,则可能需要使用stats::filter
。
答案 1 :(得分:1)
dplyr
还有一种方法:
DATA %>%
mutate(YEY = (POO + lag(POO)) / 2)
在第一行中也有NA,如果需要,可以在之后修复。
答案 2 :(得分:0)
df1<-structure(list(POO = c(2, 4, 6, 8, 10, 20)), .Names = "POO", row.names = c(NA,
-6L), class = "data.frame")
library(dplyr)
libary(zoo) # for rollmean function
df1 %>% # df1 is your data frame
mutate(TEY=rollmean(POO,2,fill=0,align="right"))
POO TEY
1 2 0
2 4 3
3 6 5
4 8 7
5 10 9
6 20 15