2016-06-21 6 views
0

ich mit einem Datenrahmen arbeite, die ein Muster von folgt:Mutierende über dplyr durch einen bestimmten Satz von Indizes

Key  Data 
Loc  Place1 
Value1 6 
Value2 7 
Loc  Place2 
Value3 8 
Loc  Place3 
Value1 9 
Value2 10 
Loc  Place4 
Value3 11 

Es ist ein rauer-Datensatz, wo ein Muster vorhanden ist - in diesem Beispiel Zeilen innerhalb sep(1,100,by=5) würden identifizieren der erste Ort einer Beobachtung. Mein Ziel ist es, den Schlüssel in diesen Positionen einzustellen, anders zu sein wie LocA anstatt Loc, um ein spread(key,value) mich mit einzigartigen Beobachtungen bieten ich für die weitere Analyse verwendet werden kann:

LocA Value1 Value2 Loc Value3 
Place1  6  7 Place2  8 
Place3  9  10 Place4  11 

Ich habe dplyr benutze und eine Kette von anderen mutiert und wählt, um zu diesem Punkt zu gelangen, so hoffe ich, in der Kette zu bleiben. Ich kann sehen, wie ich es mit einer geeigneten Teilmenge außerhalb der Kette tun kann, habe aber Schwierigkeiten, meinen Kopf um eine dplyr Lösung zu wickeln.

+0

'. %>% muate (grp = rep (seq (1, 100, by = 5), jeweils = 5))%>% group_by (grp)%>% mutate (Schlüssel = paste0 (Key, grp)) 'könnte a sein Start, hässlich wie es scheint. – r2evans

+0

Ich habe vergessen zu erwähnen, dass ich eine id/grp-Spalte erstellt habe, so wie du es zeigst - das Problem ändert nur die erste 'Loc' jeder Gruppe zum selben neuen Schlüsselnamen, wobei alle anderen Schlüssel gleich bleiben. Ich werde darüber nachdenken. – jed

Antwort

1

Ihre Daten:

df <- structure(list(Key = c("Loc", "Value1", "Value2", "Loc", "Value3", 
"Loc", "Value1", "Value2", "Loc", "Value3"), Data = c("Place1", 
"6", "7", "Place2", "8", "Place3", "9", "10", "Place4", "11")), .Names = c("Key", 
"Data"), row.names = c(NA, -10L), class = "data.frame") 

Ist dies praktikabel?

library(dplyr) 
library(tidyr) 
df %>% 
    mutate(grp = (row_number() - 1) %/% 5) %>% 
    group_by(grp) %>% 
    mutate(
    Key = ifelse(! duplicated(Key), Key, paste0(Key, "A")) 
) %>% 
    ungroup() %>% 
    spread(Key, Data) %>% 
    select(-grp) 
# Source: local data frame [2 x 5] 
#  Loc LocA Value1 Value2 Value3 
# * <chr> <chr> <chr> <chr> <chr> 
# 1 Place1 Place2  6  7  8 
# 2 Place3 Place4  9  10  11 
+0

Fantastisch. Es enthält auch etwas, das ich übersehen habe - ich habe einen anderen doppelten Schlüssel (der andere mit LocA verknüpfte Attribute darstellt). Ich entschuldige mich dafür, dass Sie die Daten nicht in einem besseren Format bereitgestellt haben, als Sie es getan haben. – jed

1

Hier ist eine andere Möglichkeit, dies zu tun. Ich gebe zu, dass dieser nicht so gut wird wie der von den oben genannten r2evans.

df <- structure(list(Key = c("Loc", "Value1", "Value2", "Loc", "Value3", 
"Loc", "Value1", "Value2", "Loc", "Value3"), Data = c("Place1", 
"6", "7", "Place2", "8", "Place3", "9", "10", "Place4", "11")), .Names = c("Key", 
"Data"), row.names = c(NA, -10L), class = "data.frame") 

library(dplyr) 
library(tidry) 

df %>% 
    mutate(gid = ceiling(row_number()/5)) %>% 
    group_by(gid) %>% 
    summarize(concatenated_text = str_c(Data, collapse = ",")) %>% 
    separate(concatenated_text, into = c("LocA", "Value1", "Value2", "Loc", "Value3"), sep=",") 
+0

Vielen Dank für diese Antwort. Es wird mir klar, dass ich tiefer in 'Stringr' eindringen muss. Ich habe 'str_c' nicht mit' separate' innerhalb einer Gruppe betrachtet. – jed

Verwandte Themen