2017-12-14 5 views
4

Ich sehe etwas unerwartetes Verhalten mit dplyr. Ich habe einen speziellen Anwendungsfall, aber ich werde ein Dummy-Problem aufstellen, um meinen Standpunkt zu verdeutlichen. Warum funktioniert das,Verwenden des Punktoperators in dplyr :: bind_cols

library(dplyr) 
temp <- bind_cols(mtcars %>% select(-mpg), mtcars %>% select(mpg)) 
head(temp) 

cyl disp hp drat wt qsec vs am gear carb mpg 
6 160.0 110 3.90 2.620 16.46 0 1 4 4 21.0 
6 160.0 110 3.90 2.875 17.02 0 1 4 4 21.0 

Aber nicht dies,

library(dplyr) 
temp <- mtcars %>% bind_cols(. %>% select(-mpg), . %>% select(mpg)) 

Error in cbind_all(x) : Argument 2 must be length 1, not 32 

Danke für die Hilfe.

+1

@markdly, wenn Sie Ihre Lösung untersuchen mit ' mtcars%>% bind_cols (wählen Sie (., -mpg), wählen Sie (., mpg)) 'das Ergebnis ist nicht korrekt. Es wendet einfach bind_cols auf 2 Kopien von mtcars an. die Auswahl wird ignoriert – Taran

+0

oops! Ja, du hast recht – markdly

Antwort

2

Sie benötigen eine Funktion mit {} zu Rohr mtcars in eine Funktion innerhalb einer anderen Funktion wickeln wie folgt aus:

library(dplyr) 

temp1 = mtcars %>% {bind_cols(select(., -mpg), select(., mpg))} 
temp2 = bind_cols(mtcars %>% select(-mpg), mtcars %>% select(mpg)) 

# > identical(temp1, temp2) 
# [1] TRUE 
+0

Ja, das scheint besser zu sein. Aber mit 'mtcars%>% {bind_cols (.%>% Select (-mpg),.%>% Select (mpg))}' scheitert immer noch mit 'Fehler in cbind_all (x): STRING_ELT() kann nur sein angewendet auf einen 'Zeichenvektor', nicht 'NULL' '. Gedanken? – Taran

+0

@Taran Ja, nicht ganz sicher, warum das nicht funktioniert. Meine Lösung hat jedoch weniger Schreibarbeit. – useR

+1

wahr! Es ist aber merkwürdig. Danke für die richtige Lösung! – Taran

0

Eine andere Lösung:

myfun <- function(x) { 
    bind_cols(x %>% select(-mpg), x %>% select(mpg)) 
} 
temp <- mtcars %>% myfun 
Verwandte Themen