gpt4 book ai didi

r - 用dplyr联接操作替换数据框的子集

转载 作者:行者123 更新时间:2023-12-04 01:46:19 25 4
gpt4 key购买 nike

假设我对数据帧的某些列值进行了如下处理:

  id animal weight   height ...
1 dog 23.0
2 cat NA
3 duck 1.2
4 fairy 0.2
5 snake BAD


df <- data.frame(id = seq(1:5),
animal = c("dog", "cat", "duck", "fairy", "snake"),
weight = c("23", NA, "1.2", "0.2", "BAD"))


假设该处理需要在单独的表中工作,并给出以下数据框,该数据框是原始数据的一个子集:

  id animal weight
2 cat 2.2
5 snake 1.3

sub_df <- data.frame(id = c(2, 5),
animal = c("cat", "snake"),
weight = c("2.2", "1.3"))


现在,我想再次将它们放在一起,因此我使用如下操作:

> df %>%
anti_join(sub_df, by = c("id", "animal")) %>%
bind_rows(sub_df)

id animal weight
4 fairy 0.2
1 dog 23.0
3 duck 1.2
2 cat 2.2
5 snake 1.3


是否存在某种直接通过联接操作执行此操作的方法?

如果子集只是关键列而要进行处理的变量对象(id,动物体重)而不是原始数据框的总变量(id,动物,体重,身高),那么如何组装子集与原始设置?

最佳答案

您描述的是一个联接操作,您可以在其中更新原始数据集中的一些值。由于data.table的快速联接和按引用更新的概念(:=),因此在使用setDF时具有良好的性能非常容易做到。

这是您的玩具数据的示例:

library(data.table)
setDT(df) # convert to data.table without copy
setDT(sub_df) # convert to data.table without copy

# join and update "df" by reference, i.e. without copy
df[sub_df, on = c("id", "animal"), weight := i.weight]


现在,数据已更新:

#   id animal weight
#1: 1 dog 23.0
#2: 2 cat 2.2
#3: 3 duck 1.2
#4: 4 fairy 0.2
#5: 5 snake 1.3


您可以使用 data.frame切换回普通的

关于r - 用dplyr联接操作替换数据框的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44930149/

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