R - Как добавить несколько условий, используя мутацию и фильтр

RMN спросил: 28 марта 2018 в 03:52 в: r

Я работаю с набором данных, и я понимаю, как настроить одно условие с помощью mutate и filter, но я хотел бы настроить несколько условий в зависимости от значения user_location. Кроме того, в случае отсутствия user_location в какой-либо стране, я хотел бы установить = "Другое".

# 1. Some values from the original dataframe
lat = c(-58.3815591, -63.6166720, -58.3815591, -102.5527840, -58.3815591)
lon = c(-34.6036844, -38.4160970, -34.6036844, 23.6345010, -34.6036844)
user_location = c('Buenos Aires, Argentina', 'Argentina', 'Buenos Aires', 'México', 'Ciudad Autónoma de Buenos Aire')
n = c(88,81,71,29,26)b = data.frame(lat,lon,user_location,n)# 2. Filter
#Just for the example:
c_argentina <- c("Argentina","Buenos Aires","Bs As",'Bs Aires','iudad   Aut*noma','San Telmo') 
c_mexico <- c("M*xico","Veracruz")#For the complete dataset, I will be using filters for 10+ countries
c_peru <- c("Per*","Lima") 
c_brazil <- c('Brazil','Brasil','Brasilia','Rio de Janeiro','Sao Paulo') 
c_chile <- c("Chile","Santiago") 
c_uruguay <- c("Uruguay","Montevideo",'Durazno') 
c_ecuador <- c("Ecuador","Guayaquil") 
c_united_states <- c("USA","Washington","DC","Chicago",'United States','NY','Miami') 
c_canada <- c("Canada","Montreal","Alberta","Ottawa") # 3. Create a new column 
# For now, I understand how to setup just one condition.
b <- b %>%
as_tibble() %>% 
subset(user_location %in% c_argentina) %>%
mutate(country = "Argentina") `

1 ответ

Есть решение
tigerloveslobsters ответил: 28 марта 2018 в 11:06

Исходные данные

lat = c(-58.3815591, -63.6166720, -58.3815591, -102.5527840, -58.3815591)
lon = c(-34.6036844, -38.4160970, -34.6036844, 23.6345010, -34.6036844)
user_location = c('Buenos Aires, Argentina', 'Argentina', 'Buenos Aires', 'México', 'Ciudad Autónoma de Buenos Aire')
n = c(88,81,71,29,26)b = data.frame(lat,lon,user_location,n,stringsAsFactors = F)

Ожидаемые результаты

lat = c(-58.3815591, -63.6166720, -58.3815591, -102.5527840, -58.3815591, NA) 
lon = c(-34.6036844, -38.4160970, -34.6036844, 23.6345010, -34.6036844, NA) 
user_location = c('Buenos Aires, Argentina', 'Argentina', 'Buenos Aires', 'México', 'Ciudad Autónoma de Buenos Aire','London') 
n = c(88,81,71,29,26,101) 
country = c('Argentina', 'Argentina', 'Argentina', 'México', 'Argentina', 'Other') 
result = data.frame(lat,lon,user_location,n,country)

Разметка фильтра

c_united_states <- c("USA","Washington","DC","Chicago",'United States','NY','Miami') 
c_argentina <- c("Buenos Aires","Buenos Aire","Argentina") 
c_mexico <- c("México")

Решения

library(dplyr)

1.Связать соответствующий город с каналом

 c1 <- paste0(c_united_states,collapse = "|")
 c2 <- paste0(c_argentina,collapse = "|")
 c3 <- paste0(c_mexico,collapse = "|") 

2. Создать фрейм данных для соответствующего города и название страны.

c_country <- rbind(c(c1,"US"),c(c2,"Argentina"),c(c3,"Mexico")) %>%
data.frame(stringsAsFactors = F)

3. Закажите все новое название страны как "Другое"

b$country <- "Other"

4. С помощью цикла выполните соответствовать, так как критерии соответствия grep / grepl могут принимать только один за раз.

for (i in 1:nrow(c_country)) {
b$country <- ifelse(grepl(pattern = c_country$X1[i],x = b$user_location),c_country$X2[i],b$country)
}

Ваш конечный результат такой же, как показано ниже.

RMN ответил: 28 марта 2018 в 02:50
Большое спасибо! Я действительно ценю все комментарии, которые вы добавляли каждый шаг за шагом. Я начинаю работать с R, и это упражнение выходит за рамки моих нынешних навыков.
tigerloveslobsters ответил: 28 марта 2018 в 03:18
нп вообще. Каждый удивительный пользователь R начал с того места, где вы находитесь! Надеюсь, это полезно. :)