gpt4 book ai didi

R根据其引用列将特定列从一个数据帧合并到另一个数据帧

转载 作者:行者123 更新时间:2023-12-03 23:52:51 25 4
gpt4 key购买 nike

我是 R 初学者。我有两个巨大的数据框,我想在 hkdata.2 添加一个名为 Vaccine 的新列,该数据是根据 hkdata.2 的 2 个引用列(hhID 和成员)从另一个 DF 依从性中获取的,有人可以帮我吗?

hkdata.2
hhID member T0 delta X_hh X_fm ILI age
1 1 7 0 0 0 0 44
1 2 7 0 0 0 0 36
2 1 8 0 1 0 0 39
2 2 8 0 1 0 0 39

adherence
hhID member mask soap vaccine
1 0 1 0 1
1 1 1 1 1
1 2 0 0 1
2 0 1 0 0
2 1 0 0 0
2 2 1 0 1

所以最后我可以得到这样的东西。在 hkdata.2 中有一个名为疫苗的额外列

hkdata.2
hhID member T0 delta X_hh X_fm ILI age vaccine
1 1 7 0 0 0 0 44 1
1 2 7 0 0 0 0 36 1
2 1 8 0 1 0 0 39 0
2 2 8 0 1 0 0 39 1

最佳答案

更新:v1.9.6 用于 on= 语法。查看旧代码的历史记录。

require(data.table) # v1.9.6+
setDT(hkdata.2)[setDT(adherence), vaccine := i.vaccine, on=c("hhID", "member")]
# hhID member T0 delta X_hh X_fm ILI age vaccine
# 1: 1 1 7 0 0 0 0 44 1
# 2: 1 2 7 0 0 0 0 36 1
# 3: 2 1 8 0 1 0 0 39 0
# 4: 2 2 8 0 1 0 0 39 1
  1. setDT通过引用将data.frame转换为data.table。

  2. on= 指定的列执行连接。 请注意,此连接既 a) 快速 *又* b) 内存高效。 a) *fast* 因为它们是基于二分搜索的连接,并且这里根本没有复制。 vaccine列直接添加到您的hkdata.2data.table。 b) *内存效率*,因为只有您需要的列vaccine`用于连接,而不是其他列(这对于非常大的数据集特别有用)。


这是一个假设每个 hhID 中有 100,000 个 hhID 和 200 个 member 的基准:

require(data.table) # v1.9.6
require(dplyr) # 0.4.3.9000

set.seed(98192L)
N = 40e6 # 40 million rows
hkdata.2 = data.frame(hhID = rep(1:1e5, each=200),
member = 1:200,
T0 = sample(10),
delta = sample(0:1),
X_hh = sample(0:1),
X_fm = sample(0:1),
ILI = sample(0:1),
age = sample(30:100, N/2, TRUE))

# let's go with 100,000 hhIDs and 400 members here:
adherence = data.frame(hhID = rep(1:1e5, each=400),
member = 1:400,
mask = sample(0:1),
soap = sample(0:1),
vaccine = sample(0:1))

## dplyr timing
system.time(ans1 <- left_join(hkdata.2, select(adherence, -soap, -mask)))
# user system elapsed
# 16.977 2.163 19.605
## data.table timing
system.time(setDT(hkdata.2)[setDT(adherence), vaccine := i.vaccine, on=c("hhID", "member")])
# user system elapsed
# 1.186 0.233 1.427

dplyr 的内存使用峰值为 4.7GB,耗时 19.6 秒,而 data.table 耗时 1.4 秒,内存使用峰值为 2.2GB。

Summary: data.table is ~14x faster and ~2.1x memory efficient here.

关于R根据其引用列将特定列从一个数据帧合并到另一个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25003114/

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