我有两个数据框。观察的数量有很大的不同,我想将某些信息从一个数据帧转换为另一个数据帧,以某种逻辑关系为条件,但我似乎无法做到。缩小比例的示例如下所示:
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])]
}
但是不同大小的数据库(或其他东西)给我带来麻烦(它给我带来错误,结果是错误的)。似乎结果没有像我想要的那样照顾条件,并且受两个数据集中的相对位置和结构的影响。 原则上,我不想合并数据集(我们正在谈论的是真实数据中的大量观测值),并且希望有一种方法可以做到这一点。 谢谢!
答案 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]
}