Условное извлечение нескольких подстрок, в частности с использованием grepl, индексирование извлечений для возврата кумулятивного значения - PullRequest
0 голосов
/ 20 мая 2018

Доброго всем дня,

У меня проблемы с выполнением этой сложной задачи, поэтому я хотел бы найти элегантный подход к:

  1. Мне нужно использовать адаптируемыйметод, подобный циклу для каждого элемента строки в 'Zone'
  2. для извлечения нескольких подстрок по строкам из 'country_name', сгруппированных по элементам 'Zone'индексированное значение для использования против df2
  3. сопоставление индексированных значений с фреймом данных в df2
  4. . Рассчитать общую численность и преобразовать ее в df1

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

Первый фрейм данных:

df1 <- data.frame(zone, country_name)
zone = c("M", "N", "O")
country_name = c("The USA, Canada & Mexico are part of North America", "Canada like Australia is a Commonwealth member", "The UK is still finalizing its exit plans from the EU")

Второй фрейм данных:

df2 <- data.frame(zonal_region, country, population)
zonal_region = c("M", "M", "M", "N", "N", "N", "O", "O", "O")
country = c("USA", "Canada", "Mexico", "Canada", "Australia", "UK", "Australia", "UK", "Canada")
population = c(323.4 , 36.29, 127.5, 36.29, 24.13, 65.64, 24.13, 65.64, 36.29)

Вот как мойконечный результат выглядит следующим образом:

df3 <- data.frame(zone, country_name, total_population)
zone = c("M", "N", "O")
country_name = c("The USA, Canada & Mexico are part of North America", "Canada like Australia is a Commonwealth member", "The UK is still finalizing its exit plans from the EU")
total_population = c(487.19, 60.42, 65.64)

У меня были проблемы с извлечением нескольких подстрок и индексацией их значений по df2, учитывая их зону.

Это было бы оченьочень признателен, если кто-нибудь может решить эту проблему.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Вы можете попробовать fuzzyjoin

library(dplyr)
library(stringr)
library(fuzzyjoin)

df1 %>% 
  mutate_if(is.factor, as.character) %>%
  fuzzy_left_join((df2 %>% mutate_if(is.factor, as.character)),
                  by = c("zone" = "zonal_region", "country_name" = "country"), 
                  match_fun = str_detect) %>%
  group_by(zone, country_name) %>%
  summarise(total_population = sum(population)) %>%
  data.frame()

Вывод:

  zone                                          country_name total_population
1    M    The USA, Canada & Mexico are part of North America           487.19
2    N        Canada like Australia is a Commonwealth member            60.42
3    O The UK is still finalizing its exit plans from the EU            65.64

Пример данных:

df1 <- structure(list(zone = structure(1:3, .Label = c("M", "N", "O"
), class = "factor"), country_name = structure(c(3L, 1L, 2L), .Label = c("Canada like Australia is a Commonwealth member", 
"The UK is still finalizing its exit plans from the EU", "The USA, Canada & Mexico are part of North America"
), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(zonal_region = structure(c(1L, 1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L), .Label = c("M", "N", "O"), class = "factor"), 
    country = structure(c(5L, 2L, 3L, 2L, 1L, 4L, 1L, 4L, 2L), .Label = c("Australia", 
    "Canada", "Mexico", "UK", "USA"), class = "factor"), population = c(323.4, 
    36.29, 127.5, 36.29, 24.13, 65.64, 24.13, 65.64, 36.29)), class = "data.frame", row.names = c(NA, 
-9L))
0 голосов
/ 20 мая 2018

Мы можем сделать это путем объединения left/right с двумя наборами данных после извлечения 'country' из столбца 'country_name' в 'df1' и выполнения group_by sum

library(tidyverse)
un1 <- unique(df2$country)
df1 %>%
   mutate(cntry =  str_extract_all(country_name, paste(un1, collapse="|"))) %>% 
   right_join(df2, by = c('zone' = 'zonal_region')) %>% 
   group_by(zone) %>% 
   summarize(total_population= sum(population[country %in% cntry[[1]]])) %>% 
   left_join(df1) %>%
   select(zone, country_name, total_population)
# A tibble: 3 x 3
#  zone  country_name                                          total_population
  <fct> <fct>                                                            <dbl>
#1 M     The USA, Canada & Mexico are part of North America               487. 
#2 N     Canada like Australia is a Commonwealth member                    60.4
#3 O     The UK is still finalizing its exit plans from the EU             65.6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...