Ввести значение ячейки с условием - PullRequest
2 голосов
/ 31 мая 2019

У меня есть этот фрейм данных:

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 = idy температуры выше 10.

Я пытался с этим:

df = df %>%  group_by(Date) %>% mutate( Temp = ifelse ( Temp >10 , mean(Temp[idy =idx] , na.rm = TRUE), Temp))

Но среднее значение не рассчитывается надлежащим образом. Значение составляет 7,33 вместо 2,66.

1 Ответ

2 голосов
/ 31 мая 2019

Если я вас правильно понял и если больше нет крайних случаев, это должно сработать

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, превышающие 10, сначала находят соответствующие им значения idy, затем idx и получают mean из этих Temp значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...