【问题标题】:R: Multiple conditions with non existing columnsR:具有不存在列的多个条件
【发布时间】:2019-02-19 21:38:25
【问题描述】:

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

【问题讨论】:

  • 列的名称是否一致,即使它们不存在?两个不同的导入工作表的Title 2 的含义是否相关?
  • 如果我没听错的话,是的,他们是。 Title 2 将出现在同一位置(与任何其他列一样,如果找到,则在程序搜索期间。问题是,您不能 100% 确定所有“2”(如 Title 2、@根据每项研究,987654334@、H1-2 将会或不会。(猜想这是主要挑战)。
  • 那么,如果您有多个 dfs,但并非所有 dfs 都包含出现在所有 dfs 中的所有列,您是否尝试将 dfs 与来自dplyrbind_rows 堆叠在一起?这比rbind 更宽容,因为它只会在给定df 中不存在列的情况下引入NAs。
  • 这确实是个好主意。虽然我需要知道它的名称中是否确实有任何带有“2”的东西。这让我想到了另一种分析这些数据的方法。然而,这偏离了我最初的想法,将所有内容逐列过滤,准确查看集合中的哪些列,以及每个列的数据。虽然如果我bind_column,我将在 URL 列中有一个副本(可能应该提到整个数据集进行分析),然后我可以定义列的任何“2”在哪里。谢谢你。 (但想看看,也许还有其他解决方案这很接近
  • 为什么不能有条件地使用if_elsegrepl 执行此操作?如果满足(或不满足)条件,则 bind_rows.

标签: r if-statement multiple-conditions


【解决方案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 = ' | '))

希望这会有所帮助,如果您有一个新列,这将使您的代码更简洁、更容易修改

【讨论】:

  • 感谢您的选择!我确实知道确切地知道数据集中的哪些列是最简单的方法(并且在某些时候更快),但整个事情的目的是编写一个代码,它可以在某种程度上适应不断变化的数据集。我认为我忘记提到的重要部分:
  • 我还在想有没有办法说(带代码)filter( Title 1, **Title 2` , Meta Description 1)` **如果没有标题 2 - 删除它并继续下一次迭代 我使用 one_of 函数从主集中收集列:df &lt;- one_of("Title 1", "Title 2", "Title 3") 所以如果没有“标题 2”或“标题 3”,它只会添加什么存在并发送警告,表示缺少某些内容,但不会停止计算。
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
相关资源
最近更新 更多