R:多个条件不存在的列

时间:2019-02-19 21:38:26

标签: r if-statement multiple-conditions

我正在使用一个程序,该程序提供excel表作为研究结果。 有很多列,例如Title 1Title 2等。

有时,其中某些列可能会不存在-就像根本没有Title 2一样。

我想创建代码,这将说明可能缺少的表。 基本上以1检查表中存在哪些列,然后筛选可用数据。

问题是,如果在过滤器中存在不存在的列-代码因错误而停止,我需要它继续进行下一个计算。

我想出了一个长解决方案:

if( "Title 2"%in% (colnames(Meta_Data))&"Meta Description 2"%in%(colnames(Meta_Data))&"H1-2"%in%(colnames(Meta_Data)))

  {Correct <- Meta_Data %>%  
      filter(  `Title 1 Length` > 60 | `Title 1 Length` < 50 
            |  `Title 2 Length` > 60 | `Title 2 Length` < 50
            |  `Meta Description 1 Length`> 300 | `Meta Description 1` < 50
            |  `Meta Description 2 Length`> 300 | `Meta Description 2` < 50
            |  `H1-1`>70   | `H1-1` < 20
            |  `H1-2` > 70 | `H1-2` < 20
            |  `H2-1`>70   | `H2-1` < 20
            |  `H2-2` > 70 | `H2-2` < 20
            )
} else if("Meta Description 2"%in%(colnames(Meta_Data)) & "H1-2"%in%(colnames(Meta_Data)))
  {Correct <- Meta_Data %>%  
      filter   (  `Title 1 Length` > 60 | `Title 1 Length` < 50 
               |  `Meta Description 1 Length`> 300 | `Meta Description 1` < 50
               |  `Meta Description 2 Length`> 300 | `Meta Description 2` < 50
               |  `H1-1`>70   | `H1-1` < 20
               |  `H1-2` > 70 | `H1-2` < 20
               |  `H2-1`>70   | `H2-1` < 20
               |  `H2-2` > 70 | `H2-2` < 20
      )

} else if ("Title 2" %in% (colnames(Meta_Data)) &"H1-2"%in% (colnames(Meta_Data)))
  {Correct <- Meta_Data %>%  
    filter   (  `Title 1 Length` > 60 | `Title 1 Length` < 50 
             |  `Title 2 Length` > 60 | `Title 2 Length` < 50
             |  `Meta Description 1 Length`> 300 | `Meta Description 1` < 50
             |  `H1-1`>70   | `H1-1` < 20
             |  `H1-2` > 70 | `H1-2` < 20
             |  `H2-1`>70   | `H2-1` < 20
             |  `H2-2` > 70 | `H2-2` < 20
    )

} else if("Title 2"%in%(colnames(Meta_Data))&"Meta Description 2"%in%(colnames(Meta_Data)))
  {Correct <- Meta_Data %>%  
    filter   (  `Title 1 Length` > 60 | `Title 1 Length` < 50 
             |  `Title 2 Length` > 60 | `Title 2 Length` < 50
             |  `Meta Description 1 Length`> 300 | `Meta Description 1` < 50
             |  `Meta Description 2 Length`> 300 | `Meta Description 2` < 50
             |  `H1-1`>70   | `H1-1` < 20
             |  `H2-1`>70   | `H2-1` < 20
             |  `H2-2` > 70 | `H2-2` < 20
    )

} else if ("H1-2"%in%(colnames(Meta_Data)))
  { Correct <- Meta_Data %>%  
    filter(  `Title 1 Length` > 60 | `Title 1 Length` < 50 
             |  `Meta Description 1 Length`> 300 | `Meta Description 1` < 50
             |  `H1-1`>70   | `H1-1` < 20
             |  `H1-2` > 70 | `H1-2` < 20
             |  `H2-1`>70   | `H2-1` < 20
             |  `H2-2` > 70 | `H2-2` < 20
    )

} else if ("Meta Description 2"%in%(colnames(Meta_Data)))
  {Correct <- Meta_Data %>%  
    filter(  `Title 1 Length` > 60 | `Title 1 Length` < 50 
             |  `Meta Description 1 Length`> 300 | `Meta Description 1` < 50
             |  `Meta Description 2 Length`> 300 | `Meta Description 2` < 50
             |  `H1-1`>70   | `H1-1` < 20
             |  `H2-1`>70   | `H2-1` < 20
             |  `H2-2` > 70 | `H2-2` < 20
    )

} else if ("Title 2"%in%(colnames(Meta_Data)))
  {Correct <- Meta_Data %>%  
    filter(  `Title 1 Length` > 60 | `Title 1 Length` < 50 
             |  `Title 2 Length` > 60 | `Title 2 Length` < 50
             |  `Meta Description 1 Length`> 300 | `Meta Description 1` < 50
             |  `H1-1`>70   | `H1-1` < 20
             |  `H2-1`>70   | `H2-1` < 20
             |  `H2-2` > 70 | `H2-2` < 20
    )
} else 
  {Correct <- Meta_Data %>%
    filter (`Title 1 Length` > 60 | `Title 1 Length` < 50 
            |  `Meta Description 1 Length`> 300 | `Meta Description 1` < 50
            |  `H1-1`>70   | `H1-1` < 20
            |  `H2-1`>70   | `H2-1` < 20
            |  `H2-2` > 70 | `H2-2` < 20

    )

}

这考虑了Title 2 | Meta Description 2 | H1-2

但是,看来我也应该考虑H2-2,这将添加更多的迭代/代码行。

(注意:如果列Title 2存在,那么Title 2 Length也存在,这也适用于其他列)。

我想了解,是否有更简单的解决方案(应该有),因为如果存在5个以上可能不存在的条件(列),那将是一场噩梦。
(不幸的是,我没有很好的数学或编码背景)

1 个答案:

答案 0 :(得分:1)

我认为您可以构建data.frame作为列的参考,并知道可用的列,然后进行过滤。

最后,如果要添加到Excel输出中的新列或新列/过滤器,则代码更少,更易于更新。

让我展示我的方法

  1. 首先,我们必须创建数据框架,其中一列包含列名,另一列包含将要放入过滤器的代码
# in col_names write every column name that can be filtered
# and in ch_filter the filter command you want to apply to your Meta_Data
df <- data.frame(col_names = c('Title 1', 'Title 2', 'Meta Description 2', 'H1-2' ),
                 ch_filter = c('`Title 1` > 60', '`Title 2` < 50', '`Meta Description 2` < 50',
                               '`H1-2` > 20 | `H1-2` < 50' ))
  1. 所以现在您有了一个可以过滤的数据框,并且可以验证是否有特定的列
# get column names of your data
vector_names <- names(Meta_Data)

# filter your data.frame built in step 1
filter_options <- filter(df, col_names %in% vector_names)
  1. 最后,您现在就可以进行过滤了,因为您知道data_frame中具有的列。我们必须使用filter_()函数,因此您可以将文本粘贴到ch_filter列中。
# this will collapse all the filter instructions separated by a pipe " | "
Correct <- Meta_Data %>%
 filter(.dots = paste(filter_options$ch_filter, collapse = ' | '))

希望这会有所帮助,如果您有新的列,则会使您的代码更清晰,更容易修改