【发布时间】:2019-02-19 21:38:25
【问题描述】:
我正在使用一个程序,它提供了一个 Excel 表格作为研究结果。
有很多列,比如Title 1、Title 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 与来自
dplyr的bind_rows堆叠在一起?这比rbind更宽容,因为它只会在给定df 中不存在列的情况下引入NAs。 -
这确实是个好主意。虽然我需要知道它的名称中是否确实有任何带有“2”的东西。这让我想到了另一种分析这些数据的方法。然而,这偏离了我最初的想法,将所有内容逐列过滤,准确查看集合中的哪些列,以及每个列的数据。虽然如果我
bind_column,我将在 URL 列中有一个副本(可能应该提到整个数据集进行分析),然后我可以定义列的任何“2”在哪里。谢谢你。 (但想看看,也许还有其他解决方案这很接近 -
为什么不能有条件地使用
if_else和grepl执行此操作?如果满足(或不满足)条件,则bind_rows.
标签: r if-statement multiple-conditions