[英]Replacing rows between 2 dataframes in R
我有 2 个数据帧,我想编写一个代码,让我检查数据帧 1 中的一行是否存在于数据帧 2 中,如果存在,那么我想用行替换数据帧 1 中的行( s) 来自数据框 2。 下面是一个例子:
数据框1:
名称 | 一种 | 乙 |
---|---|---|
机管局 | 1 | 1 |
BB | 1 | 0 |
抄送 | 0 | 1 |
数据框2:
名称 | 一种 | 乙 |
---|---|---|
机管局 | 1 | 2 |
DD | 1 | 3 |
EE | 4 | 1 |
我想在两个数据帧之间切换行,结果将是:
数据框1:
名称 | 一种 | 乙 |
---|---|---|
机管局 | 1 | 2 |
BB | 1 | 0 |
抄送 | 0 | 1 |
澄清一下,我想从 dataframe1 行 AA 由行 AA dataframe2 切换。
这就是我试图做的:
df1[which(df1$name %in% df2$name)[1:nrow(df2)],] <- df2
和:
df1$name[match(df2$name,df1$name)] <- df2$name
不幸的是,两者都没有奏效。
感谢您的帮助!
这是否有效:
df1
name A B
1 AA 1 1
2 BB 1 0
3 CC 0 1
df2
name A B
1 AA 1 2
2 DD 1 3
3 EE 4 1
df2$name %in% df1$name
[1] TRUE FALSE FALSE
df1[df1$name %in% df2$name, ] = df2[df2$name %in% df1$name, ]
df1
name A B
1 AA 1 2
2 BB 1 0
3 CC 0 1
natural_join
是您正在寻找的功能
library(rqdatatable)
dataframe1 <- data.frame(
name = c('AA', 'BB', 'CC'),
A = c(1,1,0),
B = c(1,0,1)
)
dataframe2 <- data.frame(
name = c('AA', 'DD', 'EE'),
A = c(1,1,4),
B = c(2,3,1)
)
natural_join(dataframe2, dataframe1, by = "name",
jointype = 'RIGHT')
您可以进行更新加入:
i <- match(df1$name, df2$name)
j <- which(!is.na(i))
df1[j,] <- df2[i[j],]
df1
# name A B
#1 AA 1 2
#2 BB 1 0
#3 CC 0 1
数据:
df1 <- data.frame(name = c("AA","BB","CC"), A = c(1,1,0), B = c(1,0,1))
df2 <- data.frame(name = c("AA","DD","EE"), A = c(1,1,4), B = c(2,3,1))
使用A dplyr方式across
, left_join
和coalesce
library(dplyr, warn.conflicts = F)
df1 <- data.frame(name = c("AA","BB","CC"), A = c(1,1,0), B = c(1,0,1))
df2 <- data.frame(name = c("AA","DD","EE"), A = c(1,1,4), B = c(2,3,1))
df1 %>% left_join(df2, by = 'name') %>%
mutate(across(ends_with('.y'), ~coalesce(., get(gsub('\\.y', '\\.x', cur_column()))),
.names = "{gsub('.y', '', .col)}"), .keep = 'unused')
#> name A B
#> 1 AA 1 2
#> 2 BB 1 0
#> 3 CC 0 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.