2014-11-03 20 views
5

Ich bin neu in dplyr und kann nicht herausfinden, wie man die Variablen steuert, um einen Verkettungsbefehl (%>%) zu übergeben. Einfaches Beispiel: Die str_sub Funktion benötigt drei Argumente - das erste wird über %>% weitergegeben, aber wie kann ich die letzten beiden bekommen? :dplyr: benutze Verkettung um Variablen zu übergeben

library(stringr) 
library(dplyr) 
df <- data.frame(V1 = c("ABBEDHH", "DEFGH", "EFGF", "EEFD"), 
       V2=c(4, 2, 1, 1), V3=c(5, 2, 2, 1), stringsAsFactors=FALSE) 

In Basis R konnte ich tun:

with(df, str_sub(V1, V2, V3)) 

und erhalten:

## [1] "ED" "E" "EF" "E" 

Wie dies Kette? - Ich habe versucht:

df %>% str_sub(V1, V2, V3) # Here V3 is unused arg since V1 is treated as 2nd arg 

df %>% select(V1) %>% str_sub(V2, V3) # Here V2 and V3 are not recognized 

Antwort

5

Sie tun können, die folgenden:

library(dplyr) 
library(stringr) 
library(lazyeval) 

df %>% mutate(new = str_sub(V1, V2, V3)) 
#  V1 V2 V3 new 
#1 ABBEDHH 4 5 ED 
#2 DEFGH 2 2 E 
#3 EFGF 1 2 EF 
#4 EEFD 1 1 E 

Beachten Sie, dass dplyr für die Arbeit mit data.frame s gemacht wird, so sollten Ein- und Ausgang data.frames, nicht atomar Vektoren sein.

+0

(+1) Nice one ... –

+0

Perfekt! Für meinen Bedarf würde ich dann df%>% muate (neu = str_sub (V1, V2, V3))%>% select (new) – user3375672

+0

@ user3375672 hinzufügen, ja, das kannst du tun, aber beachte, dass das wegen des Ergebnisses funktioniert ist immer noch ein data.frame (mit nur 1 Spalte), kein atomarer Vektor. –

1

Man könnte auch tun:

df %>% with(str_sub(V1, V2, V3)) 

wie Sie trotzdem einen Vektor wollen. Aber jetzt sind wir wieder im verschachtelten Land.

Verwandte Themen