Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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中不同数据帧的值替换值_R_Dataframe_Replace - Fatal编程技术网

用R中不同数据帧的值替换值

用R中不同数据帧的值替换值,r,dataframe,replace,R,Dataframe,Replace,我有这种数据帧(df1): 我想通过添加第二个数据帧(df2)中的值来替换包括NAs的人员的所有变量(值_1、值_2和值_3)的值: 结果应该是: Code ID_CODE value_1 value_2 value_3 HA09U 98_ 10 90.35 89.84 90.07 HA09U 98_ 11 90.35 89.84 90.07 HA09U

我有这种数据帧(df1):

我想通过添加第二个数据帧(df2)中的值来替换包括NAs的人员的所有变量(值_1、值_2和值_3)的值:

结果应该是:

      Code    ID_CODE     value_1    value_2    value_3
     HA09U    98_ 10       90.35      89.84      90.07
     HA09U    98_ 11       90.35      89.84      90.07
     HA09U    98_ 12       90.35      89.84      90.07 
     MB03L    99_ 10       66.94      79.62      73.77
     MB03L    99_ 11       66.94      79.62      73.77
     MB03L    99_ 12       66.94      79.62      73.77
     KE17P    100_ 10      68.44      76.05      72.01
     KE17P    100_ 11      68.44      76.05      72.01
     KE17P    100_ 12      68.44      76.05      72.01
我尝试使用一些合并和绑定行函数,这一个最接近我:

df1$value_1[df1$Code == df2$Code] <- df2$value_1

df1$value\u 1[df1$code==df2$code]我们可以在
数据表
中使用联接(这里,我们假设
NA
列是
数值
类,而不是
逻辑


或者使用
tidyverse

library(dplyr)
library(stringr)
left_join(df1, df2, by = 'Code') %>%
  transmute(Code, ID_CODE, across(ends_with('.x'), ~ 
     coalesce(get(str_replace(cur_column(),"\\.x", ".y")), .))) %>% 
  rename_with(~ str_remove(., '\\.x'), starts_with('value_'))
-输出

df1
#    Code ID_CODE value_1 value_2 value_3
#1: MB03L  99_ 10   66.94   79.62   73.77
#2: MB03L  99_ 11   66.94   79.62   73.77
#3: MB03L  99_ 12   66.94   79.62   73.77
#4: MB03L  99_ 13   66.94   79.62   73.77
#5: MB03L  99_ 14   66.94   79.62   73.77
#6: MB03L  99_ 15   66.94   79.62   73.77
#    Code ID_CODE value_1 value_2 value_3
#1 MB03L  99_ 10   66.94   79.62   73.77
#2 MB03L  99_ 11   66.94   79.62   73.77
#3 MB03L  99_ 12   66.94   79.62   73.77
#4 MB03L  99_ 13   66.94   79.62   73.77
#5 MB03L  99_ 14   66.94   79.62   73.77
#6 MB03L  99_ 15   66.94   79.62   73.77
数据
df1
left_join()
from
dplyr
将为您提供所需的内容。在执行
left_join
之前,我尝试了
df3从
df1
中删除原始列……是的,但是原始数据帧要复杂得多,并且具有多个ID和df2中不存在的行。因此,如果我删除它们,它们将丢失,因为在新列中,它们都具有NAS,然后重写您的问题,使其包含问题的所有显著特征。代码中的“I”是什么?@psycho95由于“df1”和“df2”中的列名相同,df2列用前缀I.values_1,I.values_2标识,等。我收到'I'的
值。未找到
@95是否已加载
库(data.table)
。请使用我的文章中的数据,然后重试。谢谢,我重新启动了R,又试了一次,现在它成功了,不知道为什么以前没有。。。非常感谢你!
library(data.table)
nm1 <- grep('^value_\\d+$', names(df1), value = TRUE)
setDT(df1)[df2, (nm1) := mget(paste0('i.', nm1)), on = .(Code)]
df1
#    Code ID_CODE value_1 value_2 value_3
#1: MB03L  99_ 10   66.94   79.62   73.77
#2: MB03L  99_ 11   66.94   79.62   73.77
#3: MB03L  99_ 12   66.94   79.62   73.77
#4: MB03L  99_ 13   66.94   79.62   73.77
#5: MB03L  99_ 14   66.94   79.62   73.77
#6: MB03L  99_ 15   66.94   79.62   73.77
library(dplyr)
library(stringr)
left_join(df1, df2, by = 'Code') %>%
  transmute(Code, ID_CODE, across(ends_with('.x'), ~ 
     coalesce(get(str_replace(cur_column(),"\\.x", ".y")), .))) %>% 
  rename_with(~ str_remove(., '\\.x'), starts_with('value_'))
#    Code ID_CODE value_1 value_2 value_3
#1 MB03L  99_ 10   66.94   79.62   73.77
#2 MB03L  99_ 11   66.94   79.62   73.77
#3 MB03L  99_ 12   66.94   79.62   73.77
#4 MB03L  99_ 13   66.94   79.62   73.77
#5 MB03L  99_ 14   66.94   79.62   73.77
#6 MB03L  99_ 15   66.94   79.62   73.77
df1 <- structure(list(Code = c("MB03L", "MB03L", "MB03L", "MB03L", "MB03L", 
"MB03L"), ID_CODE = c("99_ 10", "99_ 11", "99_ 12", "99_ 13", 
"99_ 14", "99_ 15"), value_1 = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_), value_2 = c(90.77, 90.77, 90.77, 
90.77, 90.77, 90.77), value_3 = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_)), row.names = c(NA, -6L), class = "data.frame")


df2 <- structure(list(Code = c("HA09U", "MB03L"), value_1 = c(90.35, 
66.94), value_2 = c(89.84, 79.62), value_3 = c(90.07, 73.77)),
class = "data.frame", row.names = c(NA, 
-2L))