R 如何从一个数据帧中获取数据,并基于第三列的共享ID将其复制到另一个数据帧中的现有列中

R 如何从一个数据帧中获取数据,并基于第三列的共享ID将其复制到另一个数据帧中的现有列中,r,dataframe,mutate,R,Dataframe,Mutate,所以我有两个不同的数据帧:一个是我一直在处理的数据帧(df1),另一个是我需要在第一个数据帧(df2)中放入所有新数据的数据帧。Df1有几列零,等待添加数据。Df2有我需要的数据,还有一些我不关心的行和列。下面是我正在处理的数据类型的一小部分 这是我第一次发布我的数据,所以我希望我做得对。如果您需要不同的格式,请告诉我 df1: df2: 几天来,我一直在思考这个问题,尝试不同的方法,阅读了很多关于堆栈溢出的答案,但我没有给出一个明确的答案,即如何从一个数据帧获取数据,并根据第三列的共享ID将其

所以我有两个不同的数据帧:一个是我一直在处理的数据帧(df1),另一个是我需要在第一个数据帧(df2)中放入所有新数据的数据帧。Df1有几列零,等待添加数据。Df2有我需要的数据,还有一些我不关心的行和列。下面是我正在处理的数据类型的一小部分

这是我第一次发布我的数据,所以我希望我做得对。如果您需要不同的格式,请告诉我

df1:

df2:

几天来,我一直在思考这个问题,尝试不同的方法,阅读了很多关于堆栈溢出的答案,但我没有给出一个明确的答案,即如何从一个数据帧获取数据,并根据第三列的共享ID将其复制到另一个数据帧中的现有列中

基本上,我想让r看到两个数据帧在color.band列中都有一个band ABCDEF的列表,然后从与ABCDEF相同的行中的df2$bandnum获取值,并将其复制到那里的ABCDEF行中的df1$bandnum

我不想将df2中但不是df1中的行复制到df1中。我想在bandnum列中将df1中存在但不是df2中的条目标记为N/A

色带和色带号的列名和数据格式在两个数据框之间已经标准化,因此所有内容都应该对齐。 到目前为止,我对代码的理解是:

> practicedf <- left_join(x=df1, y=df2, by = "color.band", all.x = TRUE) 
%>% mutate(y = ifelse(is.na(df1$color.band), df1$bandnum, df1$color.band)) %>% select(df2$bandnum)

我们不能在联接后使用原始数据集“df1”列,因为它是
左联接
。在
tidyverse
中,我们指定了不带引号的列名。
left\u join
中没有
all.x
参数。它应该来自
merge

library(dplyr)
left_join(x=df1, y=df2, by = "color.band") %>% 
     mutate(y = ifelse(is.na(color.band), bandnum, color.band)) 

left\u join
没有属于基本R
merge
all.x=TRUE

您可以在base R中执行以下操作:

df1_test <- transform(merge(df1, df2, by = "color.band", all.x = TRUE), 
                      y = ifelse(is.na(color.band), bandnum, color.band))

df1_test如果我没有弄错,您希望使用来自新df(df2)的信息更新旧df(df1)。
在
data.table
中,您可以尝试以下操作:

libraty(data.table)
setDT(df1)
setDT(df2)
update.vars = intersect(names(df1), names(df2))  # update only common variables

df1[df2, c(update.vars) := df2[,update.vars, with=FALSE], on= 'color.band'] 

一般来说,这应该是可行的。但在给定数据中,“合并”ID(
color.band
列)不是唯一的,这可能会影响结果。

ifelse
中,您从
df1
获取值。相反,它将没有
df1$
,因为列已经在联接的数据集中,并且因为您使用了
all.x=TRUE
,所以它的行数可能比原始数据集“df1”的行数更多。我从那里得到一个错误,即“错误:无法子集不存在的列。x列
bandnum
不存在。“即使bandnum作为列存在于df1和df2中。为什么会这样?@SarahHays从你的例子来看,只有'df2'显示'bandnum','df1'中没有'bandnum'。如果两个数据集都有“bandnum”,则可能需要从其中一个数据集中删除该列中的一个。否则,它将更改为
bandnum.x
bandnum.y
谢谢!还有一个问题——当我运行view(df2)时,它运行并吐出了一列完整的波段编号,但我的其他列都没有。我该如何保存这些内容?@sarahways如果这就是您的评论的意思,您可能需要将输出分配给一个新对象,即
out@sarahways好的,您正在使用
select
作为最后一步。然后,它将仅选择该列。删除它,您将拥有所有列。我想你只需要“bandnum”一栏。可能是
select
被用作某种输出检查,后来忘记删除这些检查
df1_test <- left_join(x=df1, y=df2, by = "color.band") %>% mutate(y =
 ifelse(is.na(color.band), bandnum, color.band)) %>% select(bandnum.y) 

structure(list(bandnum.y = c("171324972", "171324972", "171324972", 
"178324697", "178324697", "178324697", "178324697", "178324697", 
"178324697", "178324697", "170364505", "170364505", "170364505", 
"170364505", "170364505", "170364505", NA, "178324692", "178324692", 
"178324692")), row.names = c(NA, -20L), class = c("tbl_df", "tbl", 
"data.frame"))
library(dplyr)
left_join(x=df1, y=df2, by = "color.band") %>% 
     mutate(y = ifelse(is.na(color.band), bandnum, color.band)) 
df1_test <- transform(merge(df1, df2, by = "color.band", all.x = TRUE), 
                      y = ifelse(is.na(color.band), bandnum, color.band))
libraty(data.table)
setDT(df1)
setDT(df2)
update.vars = intersect(names(df1), names(df2))  # update only common variables

df1[df2, c(update.vars) := df2[,update.vars, with=FALSE], on= 'color.band']