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