首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“主键列”上添加从dataframe到另一个没有重复的行。

在“主键列”上添加从dataframe到另一个没有重复的行。
EN

Stack Overflow用户
提问于 2018-08-22 15:12:58
回答 1查看 2.3K关注 0票数 1

我有两个数据(A和B)。B包含新的值,A包含过时的值。

每个数据文件都有一个列表示键,另一个列表示值。

我想要从B添加行到A,然后清除包含来自A的重复键的行(用B中的新值更新A)。顺序并不重要,我认为其他顺序更容易:清理副本,然后追加。

目前,我已经完成了这个脚本:

代码语言:javascript
复制
A <- bind_rows(B, A)
A <- A[!duplicated(A),]

我的问题是它没有清理行,因为它们不是真正的重复(值是不同的)。

我怎么能处理这事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 17:22:28

这只是一种预感,因为没有提供示例数据,但我怀疑合并比行绑定更安全:

解决方案与data.table

代码语言:javascript
复制
library(data.table)

1-重命名变量以为合并做准备

代码语言:javascript
复制
setnames(A, old="value", new="value_A")
setnames(B, old="value", new="value_B")

2-合并,确保使用all arg

代码语言:javascript
复制
dt <- merge(A, B, by="key", all=TRUE)

3.为更新使用一些规则--例如:除非缺少value_B,否则使用value_A,在这种情况下使用value_A

代码语言:javascript
复制
dt[ , value := value_B]
dt[is.na(value), value := value_A]

带R基的

代码语言:javascript
复制
names(A) <- c("key", "value_A")
names(B) <- c("key", "value_B")

df <- merge(A, B, by="key", all=TRUE)

df$value <- df$value_B
df[is.na(df$value), "value"] <- df[is.na(df$value), "value_A"]

含dplyr/tidyverse的解

代码语言:javascript
复制
library(dplyr)

df <- full_join(A, B, by="key") %>% 
      mutate(value = ifelse(is.na(value_B), value_A, value_B))

示例数据

代码语言:javascript
复制
set.seed(1234)
A <- data.frame(
    key = sample(1:50, size=20),
    value = runif(20, 1, 10))

B <- data.frame(
    key = sample(1:50, size=20),
    value = runif(20, 1, 10))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51969965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档