带有条件的估算值单元格

时间:2019-05-31 08:04:15

标签: r

我有这个数据框:

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。

1 个答案:

答案 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并获得其中的idyidx所有大于10的meanTemp个值。