Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据几个条件替换df中的某些值_R_Database_Merge - Fatal编程技术网

R 根据几个条件替换df中的某些值

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中的条件替换为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==“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