首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:具有不存在列的多个条件

R:具有不存在列的多个条件
EN

Stack Overflow用户
提问于 2019-02-20 05:38:26
回答 1查看 65关注 0票数 0

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

有时,这些列中的一些可能会缺失-就像根本没有Title 2一样。

我想创建代码,这将解决可能丢失的表。基本上是检查表中存在哪些列,然后过滤可用的数据。

问题是,如果while过滤器有一个不存在的列- code因错误而停止,我需要它来继续下一个计算。

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

代码语言:javascript
复制
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个可能或不存在的条件(列),那将是一场噩梦。

(不幸的是,我没有很好的数学或编程背景)

EN

回答 1

Stack Overflow用户

发布于 2019-02-20 08:38:44

我认为您可以构建一个data.frame作为列的引用,并知道哪些列可用,然后进行过滤。

最后,如果您有一个新列或新列/过滤器想要添加到Excel输出中,它的代码更少,更新也更容易。

让我展示一下我的方法

首先,我们必须创建数据框,其中一列包含列名,另一列包含

中的代码

代码语言:javascript
复制
# 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' ))

现在您有了一个可以过滤的数据框,并且可以验证您是否具有某个

代码语言:javascript
复制
# 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列中。

代码语言:javascript
复制
# this will collapse all the filter instructions separated by a pipe " | "
Correct <- Meta_Data %>%
 filter(.dots = paste(filter_options$ch_filter, collapse = ' | '))

如果你有一个新的专栏,我希望这能帮助你,让你的代码更整洁,更容易修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54775314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档