在 R 中满足条件时跳过一行代码

Posted

技术标签:

【中文标题】在 R 中满足条件时跳过一行代码【英文标题】:Skipping a line of code when a condition is met in R 【发布时间】:2020-09-30 18:26:58 【问题描述】:

我正在尝试根据条件跳过一行代码。我的示例数据集如下所示。

df <- data.frame(
  id = c(12,25,31,47),
  b = c("cat.1","cat.2","cat.3","cat.2"),
  drop = c(FALSE,TRUE,TRUE,TRUE))

> df
  id     b  drop
1 12 cat.1 FALSE
2 25 cat.2  TRUE
3 31 cat.3  TRUE
4 47 cat.2  TRUE

基于bdrop 变量,我打印不同的out 并将它们组合在output 中。我想在drop = FALSE时跳过一行代码。

output <- c()
for(i in 1:nrow(df)) 
  if (df$b[i] == "cat.1") 
    out <- paste0("Item_first_",df$id[i],"_",df$drop[i])
    
   else if(df$b[i] == "cat.2")  
    out <- paste0("Item_second_",df$id[i],"_",df$drop[i])
    
   else 
    out <- paste0("Item_others_",df$id[i],"_",df$drop[i])
  
  output <- c(output, out) 


print(output)
[1] "Item_first_12_FALSE" "Item_second_25_TRUE" "Item_others_31_TRUE" "Item_second_47_TRUE"

在这种情况下, "Item_first_12_FALSE" 需要从输出中删除,因为数据集中的这一行具有 drop=FALSE

我知道for() 循环中有next 函数,但它避免了整个迭代。而且,只需从数据集中删除 FALSE 看起来很容易修复,但由于其他条件组合,我特别想在 ifelse 内省略它。在这种情况下,我只需要跳过这部分满足drop=`FALSE' 条件。

 if (df$b[i] == "cat.1") 
    out <- paste0("Item_first_",df$id[i],"_",df$drop[i])
    
  

期望的输出是:

"Item_second_25_TRUE" "Item_others_31_TRUE" "Item_second_47_TRUE"

【问题讨论】:

【参考方案1】:

尝试将您的 if-else 包装在另一个 if 语句中:

output <- c()
for(i in 1:nrow(df)) 
  if (df$drop[i] == T) 
    if (df$b[i] == "cat.1") 
      out <- paste0("Item_first_",df$id[i],"_",df$drop[i])
      
     else if(df$b[i] == "cat.2")  
      out <- paste0("Item_second_",df$id[i],"_",df$drop[i])
      
     else 
      out <- paste0("Item_others_",df$id[i],"_",df$drop[i])
    
    output <- c(output, out)
    

> print(output)
[1] "Item_second_25_TRUE" "Item_others_31_TRUE" "Item_second_47_TRUE"

【讨论】:

【参考方案2】:

也许只是做这样的事情

with(df, sprintf("Item_%s_%d_%s", dplyr::case_when(b == "cat.1" ~ "first", b == "cat.2" ~ "second", TRUE ~ "others"), id, drop)[drop])

【讨论】:

【参考方案3】:

除非你必须有 for 循环

output <- unlist(ifelse((df$b == "cat.1"),list(NULL),paste("Item_second_",df$id,df$drop, sep="_")))

print (output)
#  "Item_second__25_TRUE" "Item_second__31_TRUE" "Item_second__47_TRUE"

【讨论】:

以上是关于在 R 中满足条件时跳过一行代码的主要内容,如果未能解决你的问题,请参考以下文章

在 Chrome 开发者工具中调试时跳过线

c ++程序在输入时跳过行[控制台应用程序]

#include”* .h“ 在查找预编译头使用时跳过

如果在 R 中满足条件,则从前一行获取值并连接

在 clickhouse 中加载数据时跳过 csv 标头

在 Visual Studio 2012 中调试 C++ 代码时跳过 STL 代码?