Это известная проблема, и одно возможное решение предоставляется drop.levels()
в пакете gdata , где ваш пример становится
> drop.levels(subdf)
letters numbers
1 a 1
2 b 2
3 c 3
> levels(drop.levels(subdf)$letters)
[1] "a" "b" "c"
Существует также dropUnusedLevels
в пакете Hmisc . Однако он работает только путем изменения оператора подмножества [
и здесь неприменим.
В качестве следствия прямой подход на основе столбца является простым as.factor(as.character(data))
:
> levels(subdf$letters)
[1] "a" "b" "c" "d" "e"
> subdf$letters <- as.factor(as.character(subdf$letters))
> levels(subdf$letters)
[1] "a" "b" "c"
У вас есть много разделов кода, которые в основном делают одно и то же, что нарушает принцип «Не повторяйся (СУХОЙ)» . Обычный способ избежать этого повторения - написать функцию, которая скрывает повторение.
def get_text_or_NA(container):
try:
result = container[0].getText()
except:
result = 'NA'
return result
Тогда ваш основной код -
Age = get_text_or_NA(Age_find)
Tm = get_text_or_NA(Tm_find)
Lg = get_text_or_NA(Lg_find)
и т. Д.
Вы можете использовать аналогичные средства для удаления других повторений в своем коде - я оставлю это вам. И, как говорится в комментарии @roganjosh, вам не следует использовать except:
без исключения. Ваш путь просто скрывает все проблемы. Будьте более конкретны и скрывайте только те исключения, которые ожидаете, так что неожиданные могут быть обнаружены на более высоком уровне.