Я некоторое время боролся с тем, что кажется очень простой операцией, и пробовал разные методы, но ни один из них не оказался плодотворным.
У меня есть набор данных, который выглядит следующим образом:
df <- data.frame(name = c("john", "paul", "ringo", "george", "john", "paul", "ringo", "george", "john", "paul", "ringo", "george"),
year = c(2018, 2018, 2018, 2018, 2017, 2017, 2017, 2017, 2016, 2016, 2016, 2016),
station1 = c(1, 2, 3, NA, 2, NA, 5, 6, 7, 8, 9, 0),
station2 = c(NA, 6, 8, 1, 2, 6, NA, 1, NA, 1, 5, 3),
station3 = c(NA, 2, 3, 5, 1, NA, 1, 5, 3, 1, 2, 3),
station4 = c(9, 8, 7, 6, NA, 8, 12, 8, 83, 4, 3, NA))
Теперь мне нужно создать новую переменную, назовем ее new_station, которая принимает значение, зависящее от каждого имени в каждый данный год. Например:
- Для Джон Мне нужно среднее значение station1 и station3 .
- Для Пол Мне нужно всего лишь станция 4 .
- Для ringo Мне нужно среднее значение station1, station2, station3 ;и
- Для Джордж Мне нужно всего лишь station4 .
Я пробовал несколько комбинаций фильтра, выбора и изменения, вдоль линийиз:
df %>%
filter(name == "john") %>%
select(station1, station3) %>%
mutate(new_station = rowMeans(c(station1, station3)))
Но это не позволит мне присвоить значение только значениям одной строки. Некоторые другие попытки приводят каждую строку в новом столбце к среднему значению для всех 6 ячеек (2 станции по 3 года), когда мне просто нужно среднее значение для этого конкретного года. Другие методы, которые я пробовал, не в состоянии справиться с тем фактом, что есть некоторые пропущенные значения, и я нуждаюсь в тех, которые пропущены.
Мне нужен своего рода цикл, который масштабируется, просто меняя условия для каждого имени,поскольку в реальной жизни у меня есть что-то вроде набора данных из 21 имени и 30 станций.
Есть мысли?
Примечание: если это иллюстрирует то, что я пытаюсь сделать, я знаю, каксделать это в Stata. В Stata для имени john это будет выглядеть примерно так:
egen new_station = rowmean(station1 station3) if name == "john"
Мне просто нужно сделать что-то подобное в R.
Спасибо!