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