用R中不同数据帧的值替换值
我有这种数据帧(df1): 我想通过添加第二个数据帧(df2)中的值来替换包括NAs的人员的所有变量(值_1、值_2和值_3)的值: 结果应该是:用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
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
数据
df1left_join()
fromdplyr
将为您提供所需的内容。在执行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))