gpt4 book ai didi

r - 如何将 "patch"应用于 data.frame?

转载 作者:行者123 更新时间:2023-12-02 00:12:59 27 4
gpt4 key购买 nike

没有更好的词了,我该如何将“补丁”应用到 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”,这是我在另一个数据框架中进行的交易

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

是的,我知道它执行向量扫描来创建 bool update 向量,而且子集化也不是很有效。但我最不喜欢的是我必须写出匹配的列。

最佳答案

另一种使用 data.table 的方法。假设您已将数据加载到 df1df2 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

关于r - 如何将 "patch"应用于 data.frame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608464/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com