R for 循环在 1000 次迭代后生成 NA

时间:2021-03-14 19:00:29

标签: r dataframe for-loop

我有一个简单的 for 循环,我用它来从数据框中删除任何涉及共享相似字符串的两个变量的行,当我运行循环时,它会迭代 1000 次,然后开始生成 NA,这会破坏我的循环。< /p>

<头>
到期 quote_datetime
2021-02-26 2021-02-26 10:00:00
2021-02-26 2021-02-27 10:00:00
for(row in 1:nrow(df)){
  if(grepl(df$expiration[row], df$quote_datetime[row],fixed=TRUE) == TRUE){
    df = df[-row,]
  }
}

我收到错误消息

<块引用>

如果 (grepl(df$expiration[row], df$quote_datetime[row], : 需要 TRUE/FALSE 的缺失值

每次我运行它时,它都会消除更多的行,直到它用完任何其他要消除的行,然后它就会无误地运行。感谢帮助。

1 个答案:

答案 0 :(得分:1)

出现问题是因为原始数据 'df' 获得子集 if 条件为 TRUE,即对于每个 if TRUE 情况,它会少一行。如果我们复制数据可以解决

df2 <- df
for(row in 1:nrow(df)){
   if(grepl(df$expiration[row], df$quote_datetime[row],fixed=TRUE)){
     df2 <- df2[-row,]
    }
   }

此外,grepl 仅针对 'x' 进行矢量化,而不针对 pattern 因此,如果我们需要进行矢量化,可能需要 paste {{1} }一起

pattern

或者使用对 'x' 和 'pattern 进行矢量化的函数,即 df <- df[!grepl(paste(df$expiration, collapse="|"), df$quote_datetime, fixed = TRUE), ]

str_detect