我有这个数据框:
df <- data.frame( Date = c("2017-02-23", "2017-02-23", "2017-02-23", "2017-02-23", "2017-02-23", "2017-02-23", "2017-02-25"),
idx = c(1, 2, 3, 4,5, 6, 3),
Temp = c(2, 5, 12, 12,12, 1, 5),
idy= c(1, 3, 1, 6, 2, 5, 9))
其中idx和idy是参考,而Temp是温度。
我想做的是替换Temp> 10中的值,执行以下操作。
在这种情况下,对于Temp = 12,idy为1,6,2,如果将idy与idx比较 取该idx的温度平均值。 。抱歉,很难解释。这就是我想要的:
df <- data.frame( Date = c("2017-02-23", "2017-02-23", "2017-02-23", "2017-02-23", "2017-02-23", "2017-02-23", "2017-02-25"),
idx = c(1, 2, 3, 4, 5, 6, 3),
Temp = c(2, 5, 2.66, 2.66, 2.66, 1, 5),
idy= c(1, 3, 1, 6, 2, 5, 9))
其中2.66 =(2 + 5 + 1)/ 3,它们是idx的温度=超过10的温度的idy。
我已经尝试过:
df = df %>% group_by(Date) %>% mutate( Temp = ifelse ( Temp >10 , mean(Temp[idy =idx] , na.rm = TRUE), Temp))
但均值未正确计算。该值为7.33,而不是2.66。
答案 0 :(得分:2)
如果我对您的理解正确,并且没有其他极端情况了,那么
library(dplyr)
df %>%
mutate(Temp = replace(Temp, Temp > 10, mean(Temp[idx %in% idy[Temp > 10]])))
# Date idx Temp idy
#1 2017-02-23 1 2.000000 1
#2 2017-02-23 2 5.000000 3
#3 2017-02-23 3 2.666667 1
#4 2017-02-23 4 2.666667 6
#5 2017-02-23 5 2.666667 2
#6 2017-02-23 6 1.000000 5
#7 2017-02-25 3 5.000000 9
我们也可以直接这样做
with(df, replace(Temp, Temp > 10, mean(Temp[idx %in% idy[Temp > 10]])))
#[1] 2.000000 5.000000 2.666667 2.666667 2.666667 1.000000 5.000000
逻辑是通过首先找到它们对应的replace
值,然后Temp
并获得其中的idy
来idx
所有大于10的mean
值Temp
个值。