R 根据几个条件替换df中的某些值
基本问题,但我正在寻找一个很好的解决方案(不适用于循环),在满足以下几个条件的情况下,将DF1中的条件替换为DF2的值:R 根据几个条件替换df中的某些值,r,database,merge,R,Database,Merge,基本问题,但我正在寻找一个很好的解决方案(不适用于循环),在满足以下几个条件的情况下,将DF1中的条件替换为DF2的值: DF1 Name Year Val1 A 2010 x1 A 2012 x2 B 2012 x3 C 2015 x4 C 2012 x5 如果年份具有某个值,如本例中的2012年,且DF1和DF2的名称相同,则将Val1从DF2分配给DF1 我尝试了几件事: DF1$Val1[DF1$Year==“
DF1
Name Year Val1
A 2010 x1
A 2012 x2
B 2012 x3
C 2015 x4
C 2012 x5
如果年份具有某个值,如本例中的2012年,且DF1和DF2的名称相同,则将Val1从DF2分配给DF1
我尝试了几件事:
DF1$Val1[DF1$Year==“2012”&DF1$Name==DF2$Name,]我们可以在
具有数据的列上使用联接。表
并更新“Val”
librar(data.table)
setDT(DF1)[DF2, Val1 := i.Val1, on = .(Name, Year)]
DF1
# Name Year Val1
#1: A 2010 x1
#2: A 2012 y1
#3: B 2012 y2
#4: C 2015 x4
#5: C 2012 y3
数据
DF1我认为最简单的方法是过滤掉DF2,然后将其附加到DF1
所以
DF2这里有两个基本的R解决方案
-使用匹配
:
-使用合并
+子集
:
我们可以在Name
和Year
上left\u加入df1
和df2
,并使用coalesce
从两列Val1
中选择非NA值
library(dplyr)
DF1 %>%
left_join(DF2, by = c('Name', 'Year')) %>%
mutate(Val1 = coalesce(Val1.y, Val1.x)) %>%
select(names(df1))
# Name Year Val1
#1 A 2010 x1
#2 A 2012 y1
#3 B 2012 y2
#4 C 2015 x4
#5 C 2012 y3
对不起,完全忘记了!我编辑了我的问题。这是否意味着,如果DF1中的Val1是NA,它将被DF2中的Val1替换,否则它将不会被替换?@antonina否,这将优先于当前代码中的DF2
,如果DF2
中存在Val1
,它将接受它的值或从DF1
中接受Val1
。如果需要,也可以通过将coalesce
中的参数更改为coalesce(Val1.x,Val1.y)
以优先选择DF1
。如果DF1的所有值都在DF2中,则即使是NA,也会忽略它们。如果来自DF2的Val1是NA,我不想将其加入到我的新DF中
librar(data.table)
setDT(DF1)[DF2, Val1 := i.Val1, on = .(Name, Year)]
DF1
# Name Year Val1
#1: A 2010 x1
#2: A 2012 y1
#3: B 2012 y2
#4: C 2015 x4
#5: C 2012 y3
DF1 <- structure(list(Name = c("A", "A", "B", "C", "C"), Year = c(2010L,
2012L, 2012L, 2015L, 2012L), Val1 = c("x1", "x2", "x3", "x4",
"x5")), class = "data.frame", row.names = c(NA, -5L))
DF2 <- structure(list(Name = c("A", "B", "C"), Year = c(2012L, 2012L,
2012L), Val1 = c("y1", "y2", "y3")), class = "data.frame", row.names = c(NA,
-3L))
DF2 <- dplyr::filter(DF2, Year==2012,
Name %in% unique(DF1$Name)
DF1 <- dplyr::bind_rows(DF1, DF2)
inds <- match(data.frame(t(DF2[-3]),stringsAsFactors = FALSE),
data.frame(t(DF1[-3]),stringsAsFactors = FALSE))
DF1$Val1[inds] <- DF2$Val1
> DF1
Name Year Val1
1 A 2010 x1
2 A 2012 y1
3 B 2012 y2
4 C 2015 x4
5 C 2012 y3
DF1 <- subset(within(merge(DF1,DF2,by=c("Name","Year"),all.x = TRUE),
Val1 <- ifelse(is.na(Val1.y),Val1.x,Val1.y)),
select = names(DF1))
> DF1
Name Year Val1
1 A 2010 x1
2 A 2012 y1
3 B 2012 y2
4 C 2012 y3
5 C 2015 x4
library(dplyr)
DF1 %>%
left_join(DF2, by = c('Name', 'Year')) %>%
mutate(Val1 = coalesce(Val1.y, Val1.x)) %>%
select(names(df1))
# Name Year Val1
#1 A 2010 x1
#2 A 2012 y1
#3 B 2012 y2
#4 C 2015 x4
#5 C 2012 y3