Изменить значение столбца на основе другого столбца, но только для определенных условий в первом И втором столбце (R) - PullRequest
0 голосов
/ 24 октября 2018

У меня есть фрейм данных.

city <- as.character(c("London", "Unknown", "Birmingham", "Bristol", "Unknown", "Unknown", "Unknown", "Unknown"))
city_details <- as.character(c("London", "Camden", "Birmingham", "Outside London", "Camden Town", "Westminster", "London", "Birmingham"))
city_data <- data.frame(city, city_details)

Хотя некоторые значения в столбце city неизвестны, просмотр city_details показывает, что большинство из них на самом деле находятся в Лондоне.

Итак, я могу заменить некоторые из них:

city_data$city[grepl("Camden|Westminster", city_data$city_details)] <- 'London'

Однако, это сложнее с тем, что говорит "Лондон" в city_details, потому что есть и тот, который говорит "За пределами Лондона », поэтому я не хочу просто брать что-то, что имеет« лондонский »рисунок.

Для целей этого я не ищу способ включать только точные совпадения (потому что это не совсем подходит для моих реальных данных).

Итак, я хочу выполнить эту замену только для неизвестных городских значений.

В данный момент я попробовал следующее, но ясно, что логика отключена, потому что он фактически просто изменяет все неизвестные значения в столбце города на Лондон.

city_data <- within(city_data, city[city == "Unknown"] <- (city[grepl("London", city_details)] <- 'London'))

Кто-нибудь может помочь?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Я бы предложил следующее:

one_hot <- grepl("Camden|Westminster|London", city_data$city_details) &
  city_data$city == "Unknown"
city_data$city[one_hot] <- "London"

Пример:

city <- as.character(c("London", "Unknown", "Birmingham", "Bristol", "Unknown", "Unknown", "Unknown", "Unknown"))
city_details <- as.character(c("London", "Camden", "Birmingham", "Outside London", "Camden Town", "Westminster", "London", "Tottenham"))
city_data <- data.frame(city, city_details)

> city_data
        city   city_details
1     London         London
2    Unknown         Camden
3 Birmingham     Birmingham
4    Bristol Outside London
5    Unknown    Camden Town
6    Unknown    Westminster
7    Unknown         London
8    Unknown      Tottenham

> one_hot <- grepl("Camden|Westminster|London", city_data$city_details) &
+   city_data$city == "Unknown"
> city_data$city[one_hot] <- "London"
> city_data
        city   city_details
1     London         London
2     London         Camden
3 Birmingham     Birmingham
4    Bristol Outside London
5     London    Camden Town
6     London    Westminster
7     London         London
8    Unknown      Tottenham
0 голосов
/ 31 октября 2018

Я также разработал следующий способ сделать это, который кажется мне немного более аккуратным и более интуитивным.Нет необходимости конвертировать в числовые.

city_data$city[grepl("Unknown", city_data$city) & 
               grepl("London|Camden|Westminster", city_data$city_details)] <- "London"
0 голосов
/ 24 октября 2018

Я предполагаю, что вы хотите заменить названия городов только тогда, когда city неизвестно и city_details упоминает "Лондон".В этом случае вы можете использовать следующее:

city_data$city[(as.numeric(grepl("Unknown", city)) + as.numeric(grepl("London", city_details))) == 2] <- "London"

Это отвечает на ваш вопрос?

...