【发布时间】:2020-12-02 22:08:38
【问题描述】:
我正在尝试根据一列匹配两个数据帧之间的值,然后将相应的值分配给其中一个数据帧。这是数据的样子
head(test1)
zip dat.citystate
1 80914
2 32920
3 80914
4 80914
5 80914
6 80914
head(test2)
zip citystate
1 35004 Moody, AL
2 35005 Adamsville, AL
3 35006 Adger, AL
4 35007 Alabaster, AL
5 35010 Alexander City, AL
6 35011 Alexander City, AL
test1 中的dat.citystate 列是一个空字符串""。
我想遍历test1 并从test2 中找到共享相同邮政编码的city-state 值,并将其添加到test1 的相应行中。这是我的 for 循环:
for (i in 1:nrow(test1)){
test1$dat.citystate[i] <- test2$citystate[test2$zip == test1$zip[i]])
}
但是,我收到以下错误代码:
Error: replacement has length zero
我到处寻找,但无法弄清楚这意味着什么或错误来自哪里。有什么建议吗?
【问题讨论】:
-
我认为
merge或dplyr连接是比循环更好的解决方案。查看?merge并在您的数据上进行尝试。 -
您能否编辑您的问题,以便人们可以复制/粘贴日期,以便更轻松地编写解决方案?
-
1:nrow(test1)会在你不小心有零行时失败:逻辑假设是for循环不会运行,但不幸的是1:0的长度是 2,而不是长度 0,所以它将运行,它会出错。更安全的选择是seq_len(nrow(test1))。 -
这不是
merge操作吗?我认为merge(test1, test2, by="zip", all.x=TRUE)会回答这个问题。 (有关合并/加入逻辑,请参阅 stackoverflow.com/q/1299871/3358272 和 stackoverflow.com/a/6188334/3358272。) -
下次加数据,不好意思!也感谢
seq_len(nrow(test1))的提示。我尝试了合并,但得到了一个空白列。下面发布的解决方案似乎奏效了。
标签: r database dataframe loops for-loop