由于缺少更好的词,如何将“补丁”应用于R data.frame?假设我有一个主数据库,其中包含公司和出口列以及在此示例中为1或0的所有权共享变量,但可以是任何百分比。
// master
firm outlet shares.pre
1 five 1 0
2 one 1 1
3 red 1 0
4 yellow 1 0
5 five 2 0
6 one 2 0
// many more
我想让坚定的“一”卖出“1”来坚定“红色”,这是我在另一个数据中的交易。框架
// delta
firm outlet shares.delta
1 one 1 -1
2 red 1 1
将此“补丁”或事务应用于主数据库的R中最有效的方法是什么?最终结果应如下所示:
// preferably master, NOT a copy
firm outlet shares.post
1 five 1 0
2 one 1 0 <--- was 1
3 red 1 1 <--- was 0
4 yellow 1 0
5 five 2 0
6 one 2 0
// many more
我并不特别关注后缀pre
,post
或delta
。如果它们都被命名为shares
,那也很好,我只想“添加”这些数据框。
更新:我目前的做法是
update <- (master$firm %in% delta$firm) & (master$outlet %in% delta$outlet)
master[update,]$shares <- master[update,]$shares + delta$shares
是的,我知道它会进行矢量扫描以创建布尔update
向量,并且子集化也不是很有效。但我最不喜欢的是我必须写出匹配的列。
答案 0 :(得分:2)
使用data.table
的另一种方式。假设您已将数据加载到df1
和df2
data.frame
中,
require(data.table)
dt1 <- data.table(df1)
dt2 <- data.table(df2)
setkey(dt1, firm, outlet)
setkey(dt2, firm, outlet)
dt1 <- dt2[dt1]
dt1[is.na(dt1)] <- 0
dt1[, shares.post := shares.delta + shares.pre]
# firm outlet shares.delta shares.pre shares.post
# 1: five 1 0 0 0
# 2: five 2 0 0 0
# 3: one 1 -1 1 0
# 4: one 2 0 0 0
# 5: red 1 1 0 1
# 6: yellow 1 0 0 0
答案 1 :(得分:1)
如果您提供了reproducible example,我会给出一个更准确的答案,但这是一种方式:
dat
和第二个chg
然后你可以将两者合并:
dat <- merge(dat,chg)
然后减去:
dat$shares <- with(dat, shares.pre + shares.delta )