【问题标题】:For loop error: replacement has length zeroFor 循环错误:替换的长度为零
【发布时间】: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

我到处寻找,但无法弄清楚这意味着什么或错误来自哪里。有什么建议吗?

【问题讨论】:

  • 我认为mergedplyr 连接是比循环更好的解决方案。查看?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/3358272stackoverflow.com/a/6188334/3358272。)
  • 下次加数据,不好意思!也感谢seq_len(nrow(test1)) 的提示。我尝试了合并,但得到了一个空白列。下面发布的解决方案似乎奏效了。

标签: r database dataframe loops for-loop


【解决方案1】:

Base R 解决方案(在您的示例数据中,您目前没有匹配项):

test1$dat.citystate <- with(test2, citystate[match(test1$zip, zip)])

数据:

test1 <- structure(list(zip = c(80914L, 32920L, 80914L, 80914L, 80914L, 
80914L), dat.citystate = c("Moody, AL", NA, "Moody, AL", "Moody, AL", 
"Moody, AL", "Moody, AL")), row.names = c(NA, -6L), class = "data.frame")

test2 <- structure(list(`zip citystate` = c("80914 Moody, AL", "35005 Adamsville, AL", 
"35006 Adger, AL", "35007 Alabaster, AL", "35010 Alexander City, AL", 
"35011 Alexander City, AL"), zip = c(80914, 35005, 35006, 35007, 
35010, 35011), citystate = c("Moody, AL", "Adamsville, AL", "Adger, AL", 
"Alabaster, AL", "Alexander City, AL", "Alexander City, AL")), row.names = c(NA, 
-6L), class = "data.frame")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多