2016-02-08 42 views
15

Co ma odniesienie w poniższym kodzie dplyr ?:Co oznacza okres kropki "." odniesienie?

(df <- as.data.frame(matrix(rep(1:5, 5), ncol=5))) 
# V1 V2 V3 V4 V5 
# 1 1 1 1 1 1 
# 2 2 2 2 2 2 
# 3 3 3 3 3 3 
# 4 4 4 4 4 4 
# 5 5 5 5 5 5 

dplyr::mutate_each(df, funs(. == 5)) 
#  V1 V2 V3 V4 V5 
# 1 FALSE FALSE FALSE FALSE FALSE 
# 2 FALSE FALSE FALSE FALSE FALSE 
# 3 FALSE FALSE FALSE FALSE FALSE 
# 4 FALSE FALSE FALSE FALSE FALSE 
# 5 TRUE TRUE TRUE TRUE TRUE 

okres . Jest to skrót od „wszystkich kolumn”? Czy jest to specyficzna składnia dplyr . lub czy jest to ogólna składnia R (jak omówiono here)?

Ponadto, dlaczego poniższy kod powoduje błąd?

dplyr::filter(df, . == 5) 
# Error: object '.' not found 

Odpowiedz

13

Kropka jest używana wewnątrz dplyr głównie (nie wyłącznie) w mutate_each, summarise_each i do. W pierwszych dwóch (i ich odpowiednikach SE) odnosi się do wszystkich kolumn, do których stosowane są funkcje w funs. W dokumencie do odwołuje się do (potencjalnie zgrupowanego) data.frame, dzięki czemu można odwoływać się do pojedynczych kolumn, używając .$xyz do odwołania do kolumny o nazwie "xyz".

Przyczyny nie można uruchomić

filter(df, . == 5) 

dlatego a) filter nie jest przeznaczony do pracy z wieloma kolumnami jak mutate_each na przykład i B) trzeba by użyć operatora rury %>% (pierwotnie z magrittr) .

Jednakże, można użyć go z funkcji takich jak rowSums wewnątrz filter w połączeniu z operatorem rury %>%:

> filter(mtcars, rowSums(. > 5) > 4) 
Error: Objekt '.' not found 

> mtcars %>% filter(rowSums(. > 5) > 4) %>% head() 
    lm cyl disp hp drat wt qsec vs am gear carb 
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
3 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
4 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
5 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 
6 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4 

Należy również spojrzeć na plikach magrittr Pomoc:

library(magrittr) 
help("%>%") 

Ze strony pomocy:

Umieszczanie LHS gdzie indziej w Rhs Call Często będziesz potrzebował LHS do wywołania RMS w innej pozycji niż pierwsza. W tym celu możesz użyć kropki (.) Jako symbolu zastępczego. Na przykład y %>% f(x, .) jest odpowiednikiem f(x, y), a z %>% f(x, y, arg = .) jest odpowiednikiem f(x, y, arg = z).

za pomocą kropki dla innych celów Często część atrybutu lub właściwość jest pożądana w LHS RHS wywołać oprócz wartości sama LHS, np liczba wierszy lub kolumn. To jest całkowicie poprawne, aby użyć kropki placeholder kilka razy w wywołaniu rhs, ale przez projekt zachowanie jest nieco inne, gdy używa się go wewnątrz zagnieżdżonych wywołań funkcji . W szczególności, jeśli symbol zastępczy jest używany tylko w zagnieżdżonym wywołaniu funkcji, to lhs zostanie również umieszczony jako pierwszy argument! Powodem tego jest to, że w większości przypadków uzyskuje się najbardziej czytelny kod . Na przykład iris %>% subset(1:nrow(.) %% 2 == 0) to równoważne iris %>% subset(., 1:nrow(.) %% 2 == 0), ale nieco bardziej zwarte. Możliwe jest obejście tego zachowania przez zamknięcie rs w nawiasach klamrowych. Na przykład: 1:10 %>% {c(min(.), max(.))} to , co odpowiada c(min(1:10), max(1:10)).

5

Kropka ma specjalne znaczenie w obrębie funs. W tym kontekście odnosi się do parametru fikcyjnego. Aby uzyskać opis, patrz: ?funs.

funs tworzy obiekt klasy "fun_list", który reprezentuje listę funkcji. Każdy argument funs jest nazwą funkcji, łańcuchem znaków reprezentującym nazwę funkcji lub wyrażeniem reprezentującym ciało funkcji. W ostatnim przypadku, w wyrażeniu reprezentującym ciało funkcji, argument funkcji jest reprezentowany przez kropkę, tak że . == 5 odnosi się do funkcji function(.) . == 5 (chociaż dplyr faktycznie nie konstruuje tej funkcji, ale zamiast tego używa obiektu "fun_list").

W tym przykładzie uruchomi tę funkcję raz dla każdej kolumny, tak że robi to samo, co w pytaniu, oprócz tego, że wypisuje dane wejściowe za każdym razem, gdy konstruowana funkcja (nie jest faktycznie skonstruowana, ale możemy myśleć o tym w ten sposób) nazywa się:

> out <- mutate_each(df, funs({print(.); . == 5})) 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 

W przykładzie filter, funs nie jest używany i filter nie działa z "fun_list" obiektów jakikolwiek.

dot ma inne znaczenia w innych kontekstach w dplyr i może mieć inne znaczenie w innych kontekstach również dla innych pakietów.