使用来自两个不同大小的数据集(和逻辑关系)的变量创建一个新变量

时间:2018-12-11 14:50:37

标签: r

我有两个数据框。观察的数量有很大的不同,我想将某些信息从一个数据帧转换为另一个数据帧,以某种逻辑关系为条件,但我似乎无法做到。缩小比例的示例如下所示:

year <- as.vector(c(rep(1949,5), rep(1950,5), rep(1951,5), rep(1952,5)))
moneyband <- as.vector(c(rep(c(10,20,30,40,50),4)))
rate <-as.vector(c(rep(c(0.1,0.2,0.3,0.4,0.5),2),rep(c(0.15,0.25,0.35,0.45,0.55),2)))

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

yearbig <- as.vector(c(rep(1949,10), rep(1950,10), rep(1951,10), rep(1952,11)))
earnings <- as.vector(c(rep(c(9,19,30,39,50),8),60))

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

现在,我想在大型数据库中创建一个新变量(我们将其称为ratebig),如果(大型数据库中的)收入等于钱币(小型数据库中的),则将与该收益金额相关的比率分配给该变量)。如您所见,在此示例中,值30和50会发生这种情况。其余的我希望它们为NA。

我尝试过:

databig$ratebig <- NA
for (i in 1949:1952) {
  databig$ratebig[datasmall$year == i & (databig$earnings[databig$yearbig==i]==datasmall$moneyband[datasmall$year == i])] <- datasmall$rate[datasmall$year == i & (databig$earnings[databig$yearbig==i]==datasmall$moneyband[datasmall$year == i])]
}

但是不同大小的数据库(或其他东西)给我带来麻烦(它给我带来错误,结果是错误的)。似乎结果没有像我想要的那样照顾条件,并且受两个数据集中的相对位置和结构的影响。 原则上,我不想合并数据集(我们正在谈论的是真实数据中的大量观测值),并且希望有一种方法可以做到这一点。 谢谢!

1 个答案:

答案 0 :(得分:1)

对于您的情况,merge可以正常工作

merge(databig, datasmall, by.x = c("yearbig", "earnings"), 
                          by.y = c("year", "moneyband"), all.x = TRUE)

#   yearbig earnings rate
#1     1949        9   NA
#2     1949        9   NA
#3     1949       19   NA
#4     1949       19   NA
#5     1949       30 0.30
#6     1949       30 0.30
#7     1949       39   NA
#8     1949       39   NA
#9     1949       50 0.50
#10    1949       50 0.50
#.....

关于您的for循环为何无法按预期工作的原因,您需要对databig的每一行都进行此操作

databig$ratebig <- NA
for (i in 1:nrow(databig)) {
   inds <- databig$yearbig[i] == datasmall$year & 
           databig$earnings[i] == datasmall$moneyband
   if (any(inds))
    databig$ratebig[i] <- datasmall$rate[inds]  
}