R:具有非现有列的多个条件

问题描述 投票:0回答:1

我正在使用一个程序,它提供了一个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个条件(列)可能或不存在,那将是一场噩梦。 (不幸的是,我没有良好的数学或编码背景)

r if-statement multiple-conditions
1个回答
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 = ' | '))

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

© www.soinside.com 2019 - 2024. All rights reserved.