При преобразовании множителя в числовой вектор с помощью оператора pipe%>% я ошибочно предположил, что

Myfactor%>% as.character%>% as.numeric

Даст тот же результат, что и

Myfactor%>% as.numeric (as.character (.))

c(0,1,2) %>% as.factor  %>% as.character %>% as.numeric ## returns 0,1,2
c(0,1,2) %>% as.numeric(as.character(as.factor(.)))     ## returns 0,1,2
c(0,1,2) %>% as.factor  %>% as.numeric(as.character(.)) ## returns 1,2,3 (unexpected)
myfun <- function(x) as.numeric(as.character(x))
c(0,1,2) %>% as.factor  %>% myfun                       ## returns 0,1,2

Может ли кто-нибудь объяснить расхождения в результатах? Спасибо!

1
Yonghao 7 Окт 2020 в 07:26

1 ответ

Лучший ответ

Оператор канала передает объект, переданный по конвейеру, в качестве первого аргумента следующей функции. Точка изменяет это поведение только тогда, когда находится в том же вызове функции, это объясняется в документации < / a> в разделе подробностей.

Итак, ваша третья строка эквивалентна

as.numeric(as.factor(c(0,1,2)), as.character(as.factor(c(0,1,2))))

В то время как для получения ожидаемого результата вам понадобится

c(0,1,2) %>% as.factor %>% { as.numeric(as.character(.)) }
1
tspano 13 Окт 2020 в 09:19