如何比较长度不等的df1和df2并在R中赋值

如何比较长度不等的df1和df2并在R中赋值,r,R,以下是df1和df2的定义: df1 <- data.frame(x = 1:3, y=letters[1:3]) df2 <- data.frame(x= rep(c(1,2,3),each=3)) df1使用你所谓的“快捷方式”实际上是在R中做事情的正确方式。但我确实认为手动循环有时是一个很好的练习。但在你的“生产代码”中,即你想要依赖的代码中,当它们适用时,使用内置函数 您的data.frame缺少一个选项。其他一切都很好。问题是,默认情况下,字符向量作为因子输入到data.

以下是df1和df2的定义:

df1 <- data.frame(x = 1:3, y=letters[1:3])
df2 <- data.frame(x= rep(c(1,2,3),each=3))
df1使用你所谓的“快捷方式”实际上是在R中做事情的正确方式。但我确实认为手动循环有时是一个很好的练习。但在你的“生产代码”中,即你想要依赖的代码中,当它们适用时,使用内置函数

您的
data.frame缺少一个选项。其他一切都很好。问题是,默认情况下,字符向量作为
因子
输入到
data.frame
中,当您尝试用
因子
向量中的值替换某个值时,它将替换为该级别的基础数字索引。以下是完整的代码:

df1 <- data.frame(x = 1:3, y=letters[1:3], stringsAsFactors=FALSE)

df2 <- data.frame(x= rep(c(1,2,3),each=3))

for(i in 1:length(df2$x)){

    df2$y[i]<- df1$y[which(df1$x == df2$x[i])]
}
df2
  x y
1 1 a
2 1 a
3 1 a
4 2 b
5 2 b
6 2 b
7 3 c
8 3 c
9 3 c
i
在for循环之后剩余。让我们使用它,以便您的以下命令中包含
i
。您可以将一个值重新分配给
i
,以查看您的命令将为其他值提供什么。现在让我们开始分解代码,看看问题出在哪里

> i
[1] 9
> which(df1$x == df2$x[i])
[1] 3
到目前为止看起来不错。3是我们所期望的,对吗

> df1$y[which(df1$x == df2$x[i])]
[1] c
Levels: a b c
在这里,你需要认识到“哦,这是一个因素!”。每当你看到“水平”时,“因子”灯泡应该在你的头脑中亮起

在尝试替换之前,让我们先看看值,以确保代码的其余部分没有意外修改它:

> df2$y[9]
[1] 3
看起来不错。我们知道更换后会发生什么,所以任务显然出了问题。让我们尝试一下,看看会发生什么:

> df2$y[9] <- as.factor("c")
> df2$y[9]
[1] 1
>df2$y[9]df2$y[9]
[1] 1
显然有些地方出了问题。因此,我们把问题缩小到这里。现在我们需要回去看看为什么我们要用因子替换。希望这将引导您找到
data.frame
帮助


这样的事情在
R
中很烦人,但你必须相信这样的行为是有原因的,一旦你在
R
中学习了更多的编码和
R
的哲学,你就不会有这么多的惊喜了。祝你好运

当然,“正确的方法”是简单地调用
merge(df1,df2)
而不是重新发明轮子?@aix我同意上面的评论,但我不认为他试图重新发明轮子。我想他是在试图理解轮子是如何工作的,或者至少他认为轮子是如何工作的。这是值得尊敬的努力!嗨,徐,我真是太感谢你了。我花了整个周末的时间在这件事上,变得非常沮丧。许:我真是太感谢你了。我整个周末都在做这件事,感到非常沮丧。我想放弃R…开玩笑。@user1079898是的,我知道你的意思,但不要绝望!大多数人与R的关系是爱恨关系。但这段关系持续的时间越长,爱就越能赢得:)我听说你的朋友……我想它会持续下去……如果我陷入困境,我会有你这样的专家来帮助我……谢谢
> df2$y[9]
[1] 3
> df2$y[9] <- as.factor("c")
> df2$y[9]
[1] 1