Свойство ссылочного класса в цикле for [duplicate]

По моему мнению, принятый в настоящее время ответ только изменяет порядок уровней фактора , а не фактические метки (т. е. как называются уровни фактора) , Чтобы проиллюстрировать разницу между уровнями и , рассмотрим следующий пример:

Поверните cyl в коэффициент (задающие уровни не нужны, поскольку они кодируются в алфавитно-цифровом порядке):

    mtcars2 <- mtcars %>% mutate(cyl = factor(cyl, levels = c(4, 6, 8))) 
    mtcars2$cyl[1:5]
    #[1] 6 6 4 6 8
    #Levels: 4 6 8

Измените порядок уровней (но не сами метки: cyl все еще один и тот же столбец)

    mtcars3 <- mtcars2 %>% mutate(cyl = factor(cyl, levels = c(8, 6, 4))) 
    mtcars3$cyl[1:5]
    #[1] 6 6 4 6 8
    #Levels: 8 6 4
    all(mtcars3$cyl==mtcars2$cyl)
    #[1] TRUE

Назначьте новые ярлыки cyl Порядок меток был: c (8, 6, 4), поэтому мы указываем новые метки следующим образом:

    mtcars4 <- mtcars3 %>% mutate(cyl = factor(cyl, labels = c("new_value_for_8", 
                                                               "new_value_for_6", 
                                                               "new_value_for_4" )))
    mtcars4$cyl[1:5]
    #[1] new_value_for_6 new_value_for_6 new_value_for_4 new_value_for_6 new_value_for_8
    #Levels: new_value_for_8 new_value_for_6 new_value_for_4

Обратите внимание, что этот столбец отличается от наших первых столбцов:

    all(as.character(mtcars4$cyl)!=mtcars3$cyl) 
    #[1] TRUE 
    #Note: TRUE here indicates that all values are unequal because I used != instead of ==
    #as.character() was required as the levels were numeric and thus not comparable to a character vector

Подробнее:

Если мы изменили уровни cyl, используя mtcars2 вместо mtcars3, нам нужно было бы указать метки по-разному получить тот же результат. Порядок меток для mtcars2 был: c (4, 6, 8), поэтому мы указываем новые метки следующим образом

    #change labels of mtcars2 (order used to be: c(4, 6, 8)
    mtcars5 <- mtcars2 %>% mutate(cyl = factor(cyl, labels = c("new_value_for_4", 
                                                               "new_value_for_6", 
                                                               "new_value_for_8" )))

В отличие от mtcars3$cyl и mtcars4$cyl, метки из mtcars4$cyl и mtcars5$cyl, таким образом, идентичны, хотя их уровни имеют другой порядок.

    mtcars4$cyl[1:5]
    #[1] new_value_for_6 new_value_for_6 new_value_for_4 new_value_for_6 new_value_for_8
    #Levels: new_value_for_8 new_value_for_6 new_value_for_4

    mtcars5$cyl[1:5]
    #[1] new_value_for_6 new_value_for_6 new_value_for_4 new_value_for_6 new_value_for_8
    #Levels: new_value_for_4 new_value_for_6 new_value_for_8

    all(mtcars4$cyl==mtcars5$cyl)
    #[1] TRUE

    levels(mtcars4$cyl) == levels(mtcars5$cyl)
    #1] FALSE  TRUE FALSE
0
задан Nick 3 March 2019 в 23:23
поделиться

3 ответа

Для этого вам понадобится внутренний диктат класса:

print(TrackingMeasure.__dict__[x])
0
ответ дан Alain T. 3 March 2019 в 23:23
поделиться

getattr (объект, строка)

this_tm = TrackingMeasure
for x in tracking_refs:
    print(getattr(this_tm,x))
0
ответ дан Matt Stirling 3 March 2019 в 23:23
поделиться

Вы можете использовать getattr:

tracking_refs = ['Touches','DefensiveImpact']
for x in tracking_refs:
    print(getattr(TrackingMeasure, x))
0
ответ дан Tomothy32 3 March 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: