这是一个可重复的示例:
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)}
但这给我一个错误。任何帮助欢迎!谢谢!!
答案 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