Вычислить новые строки в r фрейме данных r на основе существующих строк и столбцов - PullRequest
0 голосов
/ 07 декабря 2018

Буду признателен за подсказку, какую команду использовать для следующего: Я хочу вычислить оценки населения для городов в столбце «Имя» и для каждого года в столбце «Год».Колонка «Рост» обеспечивает скорость роста.Таким образом, формула будет выглядеть так:

Population[Lucknow,2030] = Population[Lucknow, 2020] * growth[2030]

и так далее.После df:

df <- data.frame(YEAR=c(2020,2020,2020,2030,2040,2050), NAME=c("Lucknow","Delhi","Hyderadabad",NA,NA,NA), POPULATION=c(3704, 29274,10275,NA,NA,NA), growth=c(1.0,1.0,1.0,1.10,1.18,1.24))
Year                Name           Population        growth
2020             Lucknow                 3704     1.0000000
2020               Delhi                29274     1.0000000
2020           Hyderabad                10275     1.0000000
2030                <NA>                   NA   <NA> 1.10
2040                <NA>                   NA   <NA> 1.18
2050                <NA>                   NA   <NA> 1.24

edit: после того, что Dom (спасибо!) Написал ниже, ввод будет:

df <- tibble( year = rep(c(2020,2030,2040,2050), each = 3), city =rep(c("Lucknow","Delhi","Hyderadabad"), times = 4), pop = c(3704, 29274,10275, rep(NA_integer_, times = 9)), growth = rep(c(1.0, 1.10, 1.18, 1.24), each = 3) )
    year city          pop growth
   <dbl> <chr>       <dbl>  <dbl>
 1  2020 Lucknow      3704   1   
 2  2020 Delhi       29274   1   
 3  2020 Hyderadabad 10275   1   
 4  2030 Lucknow        NA   1.1 
 5  2030 Delhi          NA   1.1 
 6  2030 Hyderadabad    NA   1.1 
 7  2040 Lucknow        NA   1.18
 8  2040 Delhi          NA   1.18
 9  2040 Hyderadabad    NA   1.18
10  2050 Lucknow        NA   1.24
11  2050 Delhi          NA   1.24
12  2050 Hyderadabad    NA   1.24

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

Year                Name           Population        growth
2020             Lucknow                 3704     1.0000000
2020               Delhi                29274     1.0000000
2020           Hyderabad                10275     1.0000000
2030             Lucknow               4074.4     1.1000000
2030               Delhi              32201.4     1.1000000
2030           Hyderabad              11302.5     1.1000000
....

Как заполнить NA в таблице?

У меня были различные попытки слияния и dplyr :: mutate, но я не смог определить, что мне нужно сделать здесь, учитывая, что это векторная операция.Я был бы рад любым указаниям на правильную команду для выполнения такой базовой операции.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Базисный год всегда 2020?Если да, то работает:

library(tidyverse)

df <- tibble( year = rep(c(2020, 2030, 2040, 2050), each = 3), 
              city = rep(c("Lucknow", "Delhi", "Hyderadabad"), times = 4), 
              pop = c(3704, 29274, 10275, rep(NA_integer_, times = 9)), 
              growth = rep(c(1.0, 1.10, 1.18, 1.24), each = 3) )

uniq <- unique(df$pop)
uniq <- uniq[!is.na(uniq)]

df$pop <- rep(uniq, length(unique(df$year)))

df <- df %>% 
  mutate(pop2 = pop * growth)
0 голосов
/ 07 декабря 2018

Использование dplyr:

library(dplyr)
df %>%
  arrange(city, year) %>%
  group_by(city) %>%
  mutate(pop = pop[1] * growth)

# A tibble: 12 x 4
# Groups:   city [3]
    year city           pop growth
   <dbl> <chr>        <dbl>  <dbl>
 1  2020 Delhi       29274    1   
 2  2030 Delhi       32201.   1.1 
 3  2040 Delhi       34543.   1.18
 4  2050 Delhi       36300.   1.24
 5  2020 Hyderadabad 10275    1   
 6  2030 Hyderadabad 11303.   1.1 
 7  2040 Hyderadabad 12124.   1.18
 8  2050 Hyderadabad 12741    1.24
 9  2020 Lucknow      3704    1   
10  2030 Lucknow      4074.   1.1 
11  2040 Lucknow      4371.   1.18
12  2050 Lucknow      4593.   1.24

Использование базы R:

df <- df[order(df[["city"]], df[["year"]]), ]
df[["pop"]] <-
  unlist(
    lapply(
      unique(df[["city"]]), 
      function(x) with(df[df[["city"]] == x, ], pop[1] * growth)
    )
  )

Использование data.table:

library(data.table)
setDT(df)[order(city, year), pop := pop[1] * growth, city]

Данные:

df <- tibble(
  year   = rep(c(2020, 2030, 2040, 2050), each = 3), 
  city   = rep(c("Lucknow", "Delhi", "Hyderadabad"), times = 4), 
  pop    = c(3704, 29274, 10275, rep(NA, times = 9)), 
  growth = rep(c(1.0, 1.10, 1.18, 1.24), each = 3)
)
0 голосов
/ 07 декабря 2018
library(tidyverse)
NAME <- c("Lucknow","Delhi","Hyderadabad")
YEAR <- seq(2020,2050,10)
POPULATION=rep(c(3704, 29274,10275),4)
pop_df <- bind_cols(expand.grid(Name=NAME,Year=YEAR),Population=POPULATION)
growth_df <- data.frame(Year=seq(2020,2050,10),growth=c(1,1.1,1.18,1.23))
pop_df <- left_join(pop_df,growth_df) %>%
  mutate(Population=round(Population*growth))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...