3

由于缺少更好的词,我如何将“补丁”应用于 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”卖给公司“红色”,我在另一个data.frame中进行了哪些交易

// 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

我并不特别关心保留后缀prepostdelta。如果它们都被命名shares也很好,我只想“添加”这些数据框。

更新:我目前的方法是这样的

update <- (master$firm %in% delta$firm) & (master$outlet %in% delta$outlet)
master[update,]$shares <- master[update,]$shares + delta$shares

是的,我知道它会进行矢量扫描以创建布尔update矢量,并且子集也不是很有效。但我最不喜欢的是我必须写出匹配的列。

4

2 回答 2

2

另一种使用方式data.table。假设您已将数据都加载到df1df2 data.frames 中,

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
于 2013-01-30T16:52:57.030 回答
1

如果您提供了可重现的示例,我会给出更准确的答案,但这是一种方法:

  • 调用你的第一个 data.framedat和你的第二个chg

然后你可以合并两者:

dat <- merge(dat,chg)

只需减去:

dat$shares <- with(dat, shares.pre + shares.delta )
于 2013-01-30T16:42:24.807 回答