【问题标题】:How to skip NA values in for loop如何在for循环中跳过NA值
【发布时间】:2020-02-19 18:53:34
【问题描述】:

我正在应用 for 循环从 RePEc 数据库生成多个 API 请求。不幸的是,数据不可重现,因为管理员给我的访问代码仅适用于我的 IP 地址,但我希望有人能帮助我找出我在 for 循环中做错了什么(我不擅长写作for 循环)。

基本上,我有一列包含 80,000 个单元格df$author_reg_2,其中包含大量 NA 值。我想跳过 NA 值,只为具有实际值的单元格生成 API 请求。

url <- "https://api.repec.org/call.cgi?code=USERCODE&getauthorrecordraw="

affiliation_2 <-vector(length=length(df$author_reg_2))
for(i in 1:length(df$author_reg_2))
    try({
        Sys.sleep(1)
        if(is.na(df$author_reg_2)) next
        affiliation_fun <- paste0(url,df$author_reg_2[i])
        affiliation_run <- fromJSON(txt=affiliation_fun) %>% select("affiliation")
        affiliation_2[i] <- paste(unlist(affiliation_run), collapse =" ")
        print(i)
    })

每次我尝试运行此脚本时,它仍然会生成错误,告诉我它正在运行 NA 值。

任何帮助表示赞赏!提前谢谢!

【问题讨论】:

  • 可以改一下if(is.na(df$author_reg_2[i])) affiliation_2[i] &lt;- NA else {affilation_run &lt;- ...
  • 在您的函数中,if 语句应该用于单个元素而不是整个列 if(is.na(df$author_reg_2)[i])
  • 太棒了!那行得通!非常感谢@akrun 一如既往的帮助!
  • 另外,我想最好初始化一个list,即affiliation_2 &lt;-vector("list", length=length(df$author_reg_2)),并在赋值中将[i]更改为[[i]]

标签: r for-loop


【解决方案1】:

当我们遍历每个元素并传递if上的逻辑(长度为1并输出1)时,需要单个元素

url <- "https://api.repec.org/call.cgi?code=USERCODE&getauthorrecordraw="

affiliation_2 <-vector("list", length=length(df$author_reg_2))
for(i in seq_along(df$author_reg_2))
try({
    Sys.sleep(1)
    if(is.na(df$author_reg_2[i])) next
    affiliation_fun <- paste0(url,df$author_reg_2[i])
    affiliation_run <- fromJSON(txt=affiliation_fun) %>% select("affiliation")
    affiliation_2[[i]] <- paste(unlist(affiliation_run), collapse =" ")
    print(i)
})

list 也将持有不同的lengthvector,并且不需要在末尾添加pastecollapse(如果是这样的话)

如果我们需要将 next 更改为 `affliation_2 中的 NA

for(i in seq_along(df$author_reg_2))
    try({
        Sys.sleep(1)
        if(is.na(df$author_reg_2[i])) {
            affiliation_2[[i]] <-  NA_character_
           }  else{
            affiliation_fun <- paste0(url,df$author_reg_2[i])
            affiliation_run <- fromJSON(txt=affiliation_fun) %>% select("affiliation")
            affiliation_2[[i]] <- paste(unlist(affiliation_run), collapse =" ")
         }
        print(i)
    })

【讨论】:

  • 再次感谢您的帮助。对此,我真的非常感激。就一个问题。每次系统遇到 NA 值时,是否有任何方法可以创建一个空单元格?我问的原因是我想将值(affiliation_2)粘贴到相应作者、论文等旁边的大型数据框中。我需要一种方法来以某种方式保留这些值相对于它们在 df 中的位置的位置。跨度>
  • @Oliver 在这种情况下,您需要affliation_2[[i] &lt;- NA 而不是next,而其他代码将包含在else
  • 好吧,这是有道理的。谢谢。你知道在这种情况下我会怎么做吗?我真的不擅长循环......
  • @Oliver 更新了帖子
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 2019-09-11
  • 2014-09-06
相关资源
最近更新 更多