我正在使用一个程序,它提供了一个excel表作为研究结果。有很多列,比如Title 1、Title 2等等。
有时,这些列中的一些可能会缺失-就像根本没有Title 2一样。
我想创建代码,这将解决可能丢失的表。基本上是检查表中存在哪些列,然后过滤可用的数据。
问题是,如果while过滤器有一个不存在的列- code因错误而停止,我需要它来继续下一个计算。
我想出了一个很长的解决方案:
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个可能或不存在的条件(列),那将是一场噩梦。
(不幸的是,我没有很好的数学或编程背景)
发布于 2019-02-20 08:38:44
我认为您可以构建一个data.frame作为列的引用,并知道哪些列可用,然后进行过滤。
最后,如果您有一个新列或新列/过滤器想要添加到Excel输出中,它的代码更少,更新也更容易。
让我展示一下我的方法
首先,我们必须创建数据框,其中一列包含列名,另一列包含
中的代码
# 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' ))现在您有了一个可以过滤的数据框,并且可以验证您是否具有某个
# 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)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 = ' | '))如果你有一个新的专栏,我希望这能帮助你,让你的代码更整洁,更容易修改。
https://stackoverflow.com/questions/54775314
复制相似问题