R: row-wise dplyr::mutieren mit Funktion, der einen Daten-frame Reihe und gibt eine Ganzzahl zurück

Ich versuche, mit Rohr mutieren-Anweisung mit einer benutzerdefinierten Funktion. Ich sah diesem wenig ähnlich SO ein post aber vergeblich.
Sagen, ich habe einen Daten-frame wie folgt aus (wobei blob ist einige variable, die nicht mit der spezifischen Aufgabe, sondern ist Teil der gesamten Daten) :

df <- 
  data.frame(exclude=c('B','B','D'), 
             B=c(1,0,0), 
             C=c(3,4,9), 
             D=c(1,1,0), 
             blob=c('fd', 'fs', 'sa'), 
             stringsAsFactors = F)

Habe ich eine Funktion verwendet, die die Variablennamen so wählen Sie basierend auf dem Wert in der exclude Spalte und z.B. berechnet eine Summe, die auf die Variablen, die nicht in exclude (das ist immer ein einzelnes Zeichen).

FUN <- function(df){
  sum(df[c('B', 'C', 'D')] [!names(df[c('B', 'C', 'D')]) %in% df['exclude']] )
}

Wenn ich gibt eine einzelne Zeile (Zeile 1) FUN bekomme ich die erwartete Summe der C und D (diejenigen, die nicht erwähnt exclude), nämlich 4:

FUN(df[1,])

Wie mache ich ähnlich wie in einem Rohr mit mutieren (addieren das Ergebnis zu einer variable s). Diese zwei versuche funktionieren nicht:

df %>% mutate(s=FUN(.))
df %>% group_by(1:n()) %>% mutate(s=FUN(.))

UPDATE
Das ja auch nicht so funktionieren wie Sie sollen:

df %>% rowwise(.) %>% mutate(s=FUN(.))

Diese Werke von Ursache aber nicht in dplyr ' s mutieren (und die Rohre):

df$s <- sapply(1:nrow(df), function(x) FUN(df[x,]))
  • Könnten Sie ein Beispiel geben? Funktioniert nicht: df %>% rowwise(.) %>% mutate(s=FUN(.)). Die Antwort von @konvas scheint etwas clumpsy (siehe mein Kommentar zu @konvas s Vorschlag)
  • Sorry, habe ich missverstanden.Sie tun kann df %>% rowwise(.) %>% mutate(s=FUN(data.frame(exclude = exclude, B = B, C = C, D = D))) oder df %>% rowwise() %>% nest(exclude:D) %>% mutate(s = map_dbl(data, FUN)) %>% unnest(). Das Problem ist, dass dplyr nicht natürlich funktionieren auf sub-Daten.frames, sondern in Spalten (D. H. Vektoren). So einige zusätzliche Tricks nötig.
  • Dies ist mehr, was ich nach ! (Für das Protokoll: es ist tidyr::nest() und purrr::map_dbl() ).
InformationsquelleAutor user3375672 | 2017-05-30
Schreibe einen Kommentar