我正在使用一个程序,该程序提供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个以上可能不存在的条件(列),那将是一场噩梦。
(不幸的是,我没有很好的数学或编码背景)
答案 0 :(得分:1)
我认为您可以构建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 = ' | '))
希望这会有所帮助,如果您有新的列,则会使您的代码更清晰,更容易修改