【问题标题】:How do I apply a "patch" to a data.frame?如何将“补丁”应用于 data.frame?
【发布时间】:2013-01-30 16:08:32
【问题描述】:

由于缺少更好的词,如何将“补丁”应用于 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

我想让公司“one”将出口“1”卖给公司“red”,我在另一个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 向量,并且子集也不是很有效。但我最不喜欢的是我必须写出匹配的列。

【问题讨论】:

  • 在速度或代码长度方面效率高?
  • @AriB.Friedman 最好两者兼而有之,但代码长度更重要(数据库长约100行,是公司级数据库,不是高频股市交易的东西)

标签: r merge dataframe


【解决方案1】:

使用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

【讨论】:

  • +1 吨!有什么办法可以避免创建原始数据框的out 副本?我宁愿直接更新dt1
  • 我喜欢data.table 语法,但我猜这个分配会扫描主数据库的所有条目?这是否比我目前的方法更有效(请参阅更新的问题)?
  • 不。这是参考。从文档中了解?':='。它读作Fast add, remove and modify subsets of columns, by reference.
  • 是的,这将比您更新的解决方案快得多。尝试使用rbenchmark 进行基准测试。 Here's a post 在那里你可以得到使用rbenchmark 的想法。
【解决方案2】:

如果您提供了reproducible example,我会给出更准确的答案,但这是一种方法:

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

然后你可以合并两者:

dat <- merge(dat,chg)

然后减去:

dat$shares <- with(dat, shares.pre + shares.delta )

【讨论】:

  • +1 吨!但这不会将更改应用于我的原始dat,我该怎么做?
猜你喜欢
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2010-12-07
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多