dplyr: restar solo filas específicas según el valor del nombre en R

CorePress2024-01-25  9

Tengo un marco de datos con dos columnas, región y número de usuario. A veces, la región es una combinación de países y continentes (consulte el ejemplo ficticio a continuación). Ej: número de usuario para Oceanía (incluida Nueva Zelanda) y Nueva Zelanda. Estoy buscando una manera de restar el número de país de la fila del continente, en otras palabras, tener dos filas sin duplicaciones, Oceanía (sin Nueva Zelanda) y Nueva Zelanda. Lo mismo para Europa y Alemania, etc

Aquí los datos de muestra

df = data.frame(
  regions_user = c(2200, 1250, 900, 21200, 14200, 150000, 35000, 41900),
  regions_names = c(
    "Oceania",
    "New Zeland",
    "Africa",
    "North America",
    "Asia",
    "Europe",
    "Germany",
    "Latin America"
  ))

#sample data output

  regions_user regions_names
1         2200       Oceania
2         1250    New Zeland
3          900        Africa
4        21200 North America
5        14200          Asia
6       150000        Europe
7        35000       Germany
8        41900 Latin America

#desired output

regions_user regions_names
1          950       Oceania
2         1250    New Zeland
3          900        Africa
4        21200 North America
5        14200          Asia
6       115000        Europe
7        35000       Germany
8        41900 Latin America

1

¿Cómo se diferencia entre país y conti?¿nente? ¿Cómo saber qué país forma parte de qué continente? ¿Este mapeo está guardado en alguna parte?

- Ronak Shah

28 de marzo de 2021 a las 7:40

Buena pregunta. Sí, digamos que tenemos una lista en alguna parte. En mi caso digamos que tenemos Oceanía, Nueva Zelanda y Europa, el par de Alemania como lista

- DanG

28 de marzo de 2021 a las 7:43



------------------------------------

En caso de que el país siempre esté en la fila debajo de la región como en su conjunto de datos de ejemplo, puede usar case_when para verificar si las regiones vectoriales están en el marco de datos, luego reste la fila a continuación con un retraso.

library(dplyr)

regions <- c("Oceania", "Europe")

df %>% 
  mutate(regions_user = case_when(
    regions_names %in% regions ~ regions_user - lead(regions_user),
    TRUE ~ regions_user))

# Output
  regions_user regions_names
1          950       Oceania
2         1250    New Zeland
3          900        Africa
4        21200 North America
5        14200          Asia
6       115000        Europe
7        35000       Germany
8        41900 Latin America



------------------------------------

Siempre que tenga o cree dicha lista de mapeo:

library(dplyr)
mapping_list <- data.frame(country = c('New Zeland', 'Germany'), 
                           continent = c('Oceania', 'Europe'))

mapping_list
#     country continent
#1 New Zeland   Oceania
#2    Germany    Europe

Puedes realizar una unión y restar el valor:

df %>%
  left_join(mapping_list, by = c('regions_names' = 'country')) %>%
  group_by(continent) %>%
  summarise(subtract = sum(regions_user)) %>%
  right_join(df, by = c('continent' = 'regions_names')) %>%
  transmute(regions_names = continent, 
            regions_user = ifelse(is.na(subtract), regions_user, regions_user - subtract))

#  regions_names regions_user
#  <chr>                <dbl>
#1 Europe              115000
#2 Oceania                950
#3 New Zeland            1250
#4 Africa                 900
#5 North America        21200
#6 Asia                 14200
#7 Germany              35000
#8 Latin America        41900

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare