R Замените <NA> на дату, если значение других столбцов

Допустим, у меня есть два столбца, один из которых содержит местоположение, а другой - даты, некоторые из которых отсутствуют.

    City       Date
1   Sheffield  19/05/1985
2   Sheffield  21/06/1986
3   Sheffield  <NA>
4   Newcastle  14/07/1996
5   Newcastle  <NA>
6   Liverpool  12/11/2001

Мне нужно заменить недостающие даты фиктивной датой (скажем, 21.06.1866), но ТОЛЬКО для города Шеффилд.

В SQL синтаксис будет:

UPDATE Dataframe SET Date = "21/06/1866" WHERE city="Sheffield"

В R я пробовал следующее с ограниченным (нет) успехом:

filter <- (Dataframe$Date == is.na(Dataframe$Date) & Dataframe$City =="Sheffield")
Dataframe[filter,"Date"] <- as.Date("1866/06/21")

Однако это вызывает у меня следующую ошибку:

Ошибка в [<-.data.frame(*tmp*, фильтр, "Дата", значение = -37814): пропущенные значения недопустимы при назначении подписанных кадров данных

У кого-нибудь есть идеи? Я чувствую, что это, наверное, безумно легко, но я просто пока не вижу, как это делается.

1 ответ

df[df$City == "Sheffield" & is.na(df$Date), "Date"] = as.Date("1866/06/21", format = "%Y/%m/%d")

> df
       City       Date
1 Sheffield 1985-05-19
2 Sheffield 1986-06-21
3 Sheffield 1866-06-21
4 Newcastle 1996-07-14
5 Newcastle       <NA>
6 Liverpool 2001-11-12

если вы посмотрите на свой фильтр, он просто вернет FALSE.

> filter <- (df$Date == is.na(df$Date) & df$City =="Sheffield")
> filter
[1] FALSE FALSE FALSE FALSE FALSE FALSE

Вам просто нужно написать is.na(df$Date) это возвратит логический вектор, указывающий, является ли дата NA. То, что вы написали проверки даты - ИСТИНА или ЛОЖЬ (возвращено из is.na(df$Date)), которого никогда не бывает, потому что это свидание.

> filter <- (is.na(df$Date) & df$City =="Sheffield")
> filter
[1] FALSE FALSE  TRUE FALSE FALSE FALSE
Другие вопросы по тегам