从另一个数据集的变量获取最大服从条件

时间:2018-12-11 17:31:58

标签: r

这是一个可重复的示例:

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 :(得分:1)

如果我正确理解了您的问题,那么使用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

答案 1 :(得分:1)

假设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