2017-10-11 2 views
-1

Hier ist die Datenrahmen df, auf dem ich versuche, einen Dreh mit cast FunktionCasting Datenrahmen gibt Fehler R

dput(df) 
structure(list(Val = c(1L, 2L, 2L, 5L, 2L, 5L), `Perm 1` = structure(c(1L, 
2L, 3L, 3L, 3L, 3L), .Label = c("Blue", "green", "yellow" 
), class = "factor"), `Perm 2` = structure(c(1L, 2L, 2L, 3L, 
3L, 3L), .Label = c("Blue", "green", "yellow"), class = "factor"), 
    `Perm 3` = structure(c(1L, 2L, 2L, 2L, 3L, 3L), .Label = c("Blue", 
    "green", "yellow"), class = "factor")), .Names = c("Val", 
"Perm 1", "Perm 2", "Perm 3"), row.names = c(NA, 6L), class = "data.frame") 

und erwartet die Daten nach Dreh

Blue  1 1 1 
green  2 4 9 
yellow  14 12 7 

Ich habe versucht zu tun

zu tun
cast(df, df$Val ~ df$`Perm 1`+df$`Perm 2`+df$`Perm 3`, sum, value = 'Val') 

Aber das gibt Fehler

Error: Casting formula contains variables not found in molten data: df$Val, df$`Perm1`, df$`Perm2` 

Wie kann ich in der Lage sein, schwenken zu tun, so dass ich in der Lage sein werden, die gewünschte O/P

PS- Die Datenrahmen DF hat rund 36 Säule zu erhalten, aber der Einfachheit halber habe ich nur 3 Säulen. Jeder Vorschlag wird geschätzt.

Danke

Domnick

Antwort

1

Es scheint, Sie möchten, indem jede Permutation in ihrem Datensatz gruppiert summieren. Obwohl hacky, ich denke, das funktioniert für Ihr Problem. Zuerst erstellen wir eine Funktion, um diese Summierung unter Verwendung der Tidyeval-Syntax durchzuführen. Link für weitere Informationen: Group by multiple columns in dplyr, using string vector input

sum_f <- function(col, df) { 
    library(tidyverse) 
    df <- df %>% 
      group_by_at(col) %>% 
      summarise(Val = sum(Val)) %>% 
      ungroup() 
    df[,2] 
} 

Wir wenden es dann auf Ihre Daten-Set mit lapply und Bindung zusammen, um die Summierungen.

bind_cols(lapply(c('Perm1', 'Perm2', 'Perm3'), sum_f, df)) 

Dies erhält uns die obige Antwort. Caveats: Need den Namen der Spalten zu wissen, dass Sie für diese Summe über zu arbeiten. Außerdem muss jede Spalte die gleichen Ebenen Ihrer Permutationen aufweisen, d. H. Blau, grün, gelb. Der Code wird diese Reihenfolge respektieren.

+0

Diese richtig für mich gearbeitet, Vielen Dank @jacobsg – Domnick