Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 - Fatal编程技术网

有没有办法用R中的另一行替换一个数据帧中的行?

有没有办法用R中的另一行替换一个数据帧中的行?,r,R,我试图找出如何通过匹配其中一列的值来用另一个数据帧替换一个数据帧中的行。两个数据帧具有相同的列名 例: 我已经做了一段时间了,这是我得到的最接近- df1[which(df1$x %in% df2$x),]$y <- df2[which(df1$x %in% df2$x),]$y 但它只是用NA替换了这些值 有人知道怎么做吗 我认为这里需要的是合并或联接操作 我将StringsAsAffactors=FALSE添加到帧中,这样合并和后续工作就不会有任何问题,因为这些因素有时会造成中断 基

我试图找出如何通过匹配其中一列的值来用另一个数据帧替换一个数据帧中的行。两个数据帧具有相同的列名

例:

我已经做了一段时间了,这是我得到的最接近-

df1[which(df1$x %in% df2$x),]$y <- df2[which(df1$x %in% df2$x),]$y
但它只是用NA替换了这些值


有人知道怎么做吗

我认为这里需要的是合并或联接操作

我将StringsAsAffactors=FALSE添加到帧中,这样合并和后续工作就不会有任何问题,因为这些因素有时会造成中断

基准R:

df1% 选择-y.x,-y.y xy 1楼 2克 3 c 4d 带有data.table的联接选项,在“x”列上联接的位置,将第二个数据集i.y中的“y”值分配给第一个数据集,并具有:=

注意:最好在R4.0.0中使用stringsAsFactors=FALSE-这是默认情况,但我们需要在两个数据集中使用所有通用级别,我们可以使用match


首先,很好地制作了一个很好的可复制的例子,可以直接复制。这总是有帮助的,特别是对于预期输出的示例。不错

您有几种选择,但让我们看看您的解决方案不太有效的原因:

首先,我尝试将您的最后一行复制粘贴到一个新会话中,结果出现了可怕的错误:

Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = 1:2) :
  invalid factor level, NA generated
现在df1中有什么?不太对了

在第一行中,我交换了df2和lo中的两行,然后,交换了df1中被替换的值。为什么呢

让我们来解构您的语句df2[whichdf1$x%in%df2$x,]$y

%df2$x中的调用df1$x%返回一个逻辑向量布尔值,df1$x中的元素在df2中找到,即前两个而不是后两个。但它不涉及第一个向量中的哪个位置对应于第二个向量中的哪个位置

在%df2$x中调用whichdf1$x%会减少索引为真的逻辑向量。同样,我们现在不知道哪些元素对应于哪些元素

对于解决方案,我推荐r2evans,因为它不依赖额外的包,尽管data.table或dplyr是两个需要了解的强大包


在他的解决方案中,他使用merge执行完全连接,该连接基于值匹配行,而不是-嗯,您所做的。使用transform,他在第一个参数中调用的merge函数返回的data.frame的上下文中分配新变量。

非常感谢!Dpylr版本工作得很好,也很优雅。stringsAsFactors=FALSE是我以前从未见过的东西,现在我知道它是多么有用哇,非常感谢你的背景!我真的很感激你把这些都写出来。这一切都很有道理——我以前从未考虑过这些因素!我很高兴R4.0会将其设置为默认值:同时感谢您提供的有关问题的上下文,以及%in%——我将在将来注意到这一点。我遵循了R2Evan的解决方案,效果非常好非常感谢你!
df1[which(df1$x %in% df2$x),]$y <- df2[which(df1$x %in% df2$x),]$y
library(data.table)
setDT(df1)[df2, y := i.y, on = .(x)]
inds <- match(df1$x, df2$x)
df1$y[!is.na(inds)] <- df2$y[na.omit(inds)]
df1

#  x y
#1 1 f
#2 2 g
#3 3 c
#4 4 d
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = 1:2) :
  invalid factor level, NA generated
df2 <- df2[c(2,1),]
df1[which(df1$x %in% df2$x),]$y <- df2[which(df1$x %in% df2$x),]$y