Получить максимум в зависимости от условий из другой переменной набора данных - PullRequest
0 голосов
/ 11 декабря 2018

Вот воспроизводимый пример:

year <- as.vector(c(rep(1949,5), rep(1950,5), rep(1951,5), rep(1952,5)))
bracket <- as.vector(c(rep(c(10,20,30,40,50),4)))

datasmall <- as.data.frame(cbind(year,bracket))

yearbig <- as.vector(c(rep(1949,10), rep(1950,10), rep(1951,10), rep(1952,11)))
earnings <- as.vector(runif(41, 10, 60))

databig <- as.data.frame(cbind(yearbig,earnings))

Я хочу создать новую переменную в большой базе данных (назовем ее maxbracket), которая имеет максимальное значение скобки из "datasmall" в общем заданном году (значения в скобках могут меняться каждый год) среди этих только значений в скобках ниже значения каждого данного наблюдения за доходами.

Я пробовал это:

databig$maxbracket <- NA
for (i in 1949:1952) {
databig$maxbracket[databig$yearbig==i] <- max(datasmall$bracket[datasmall$year==i & 
(datasmall$bracket < databig$earnings[databig$yearbig==i])], na.rm = T)} 

Но это дает мне ошибку.Любая помощь приветствуется!Спасибо!!

Ответы [ 2 ]

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

Предполагается, что rate не требуется в datasmall:

library(tidyverse)

databig %>%
  left_join(datasmall, by = c("yearbig" = "year")) %>%
  group_by(yearbig) %>%
  filter(bracket < earnings) %>%
  filter(max(bracket) == bracket)
#> # A tibble: 9 x 3
#> # Groups:   yearbig [4]
#>   yearbig earnings bracket
#>     <dbl>    <dbl>   <dbl>
#> 1    1949     47.7      40
#> 2    1949     43.8      40
#> 3    1949     46.6      40
#> 4    1950     55.4      50
#> 5    1950     59.1      50
#> 6    1950     55.1      50
#> 7    1951     50.0      50
#> 8    1952     51.6      50
#> 9    1952     52.8      50
0 голосов
/ 11 декабря 2018

Если я правильно понимаю ваш вопрос, то с базой R вы можете сделать

databig$maxbracket <- mapply(function(y, e) 
  with(datasmall, max(bracket[year == y & bracket < e])), databig$yearbig, databig$earnings)
head(databig, 3)
#   yearbig earnings maxbracket
# 1    1949 12.32897         10
# 2    1949 10.87209         10
# 3    1949 50.04304         50

, что похоже на ваш подход, просто используя mapply.В частности, здесь нет веских оснований для какой-либо группировки по годам.Итак, у нас есть анонимная функция с двумя вариациями, берущая год и прибыль, для которой мы предоставляем два столбца databig и применяем их построчно.Для конкретной пары (y,e) из databig мы ищем максимум bracket в datasmall, такой что year == y & bracket < e.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...