R: несколько условий с несуществующими столбцами - PullRequest
0 голосов
/ 20 февраля 2019

Я использую программу, которая предоставляет таблицу 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 условий (столбцов), которые могут или не могут существовать.
(К сожалению, у меня нет хорошего математического или кодового фона)

1 Ответ

0 голосов
/ 20 февраля 2019

Я думаю, что вы можете создать 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' ))
Итак, теперь у вас есть фрейм данных, который вы можете отфильтровать, и вы можете проверить, есть ли у вас определенный столбец
# 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)
Наконец, вы можете сделать свой фильтр, теперь вы знаете столбцы, которые есть в вашем 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 = ' | '))

Надеюсь, это поможет и сделает ваш код более понятным и легко изменяемым, если у вас есть новый столбец

...