R 当满足另一列的条件时,计算列中特定行的平均值

R 当满足另一列的条件时,计算列中特定行的平均值,r,R,本质上,我需要在某些条件下计算行中值的平均值 Name = c("A", "A", "A", "A", "B", "B", "B", "B") temp = c(22, 22, 26, 23, 18, 20, 18, 17) peak = c(0, 0, 1, 0, 0, 1, 0, 0) new = NA d<- data.frame(Name, temp, peak, new) 我开始写一个ifelse语句,它可能看起来像这样: d$new<-ifelse(d$peak==1,

本质上,我需要在某些条件下计算行中值的平均值

Name = c("A", "A", "A", "A", "B", "B", "B", "B")
temp = c(22, 22, 26, 23, 18, 20, 18, 17)
peak = c(0, 0, 1, 0, 0, 1, 0, 0)
new = NA
d<- data.frame(Name, temp, peak, new)
我开始写一个ifelse语句,它可能看起来像这样:

d$new<-ifelse(d$peak==1, mean(peak[i-1, i+1]), d$temp)  

d$new这应该可以做到。无回路

Name = c("A", "A", "A", "A", "B", "B", "B", "B")
temp = c(22, 22, 26, 23, 18, 20, 18, 17)
peak = c(0, 0, 1, 0, 0, 1, 0, 0)
d<- data.frame(Name, temp, peak)

d$new      = temp
ind        = which(d$peak==1)
d$new[ind] = (d$temp[ind-1]+d$temp[ind+1])/2
Name=c(“A”、“A”、“A”、“A”、“B”、“B”、“B”)
温度=摄氏度(22,22,26,23,18,20,18,17)
峰值=c(0,0,1,0,0,1,0,0)

d从zoo软件包中尝试
rollapply

library(zoo)

rollfun <- function(i) with(d[i, ], if (peak[2]) mean(temp[-2]) else temp[2])
transform(d, temp.new = rollapply(seq(0, nrow(d)+1), 3, rollfun))
图书馆(动物园)
rollfun Name=c(“A”、“A”、“A”、“A”、“B”、“B”、“B”)
>温度=摄氏度(22,22,26,23,18,20,18,17)
>峰值=c(0,0,1,0,0,1,0,0)
>新=不适用
>d图书馆(动物园)
> 
>rollfun转换(d,temp.new=rollapply(seq(0,nrow(d)+1),3,rollfun))
名称temp peak new temp.new
1 A 22 0 NA 22.0
2 A 22 0 NA 22.0
3 A 26 1 NA 22.5
4 A 23 0 NA 23.0
5B180北美18.0
6B201NA18.0
7B180北美18.0
8 B 17 0 NA 17.0

在一个边缘应该发生什么,例如,当组的最后一个元素的
peak=1
时?在这种情况下,没有
temp[i+1]
。对于组中的第一个元素,
peak=1
也有同样的问题。在边缘没有峰值,因为我将peak定义为1,当温度变化在每个温度值前后都大于2.5时。谢谢!我一定是两次发错了,把另一份删掉了。关于你的评论,你尝试了,但无法让它工作,一定有什么你没有告诉我们,因为我已经添加到回答日志显示它确实工作。
library(zoo)

rollfun <- function(i) with(d[i, ], if (peak[2]) mean(temp[-2]) else temp[2])
transform(d, temp.new = rollapply(seq(0, nrow(d)+1), 3, rollfun))
> Name = c("A", "A", "A", "A", "B", "B", "B", "B")
> temp = c(22, 22, 26, 23, 18, 20, 18, 17)
> peak = c(0, 0, 1, 0, 0, 1, 0, 0)
> new = NA
> d<- data.frame(Name, temp, peak, new)
> library(zoo)
> 
> rollfun <- function(i) with(d[i, ], if (peak[2]) mean(temp[-2]) else temp[2])
> transform(d, temp.new = rollapply(seq(0, nrow(d)+1), 3, rollfun))
  Name temp peak new temp.new
1    A   22    0  NA     22.0
2    A   22    0  NA     22.0
3    A   26    1  NA     22.5
4    A   23    0  NA     23.0
5    B   18    0  NA     18.0
6    B   20    1  NA     18.0
7    B   18    0  NA     18.0
8    B   17    0  NA     17.0