2017-11-12 2 views
1

expandieren möchte Ich möchte einen Vektor von ganzen Zahlen in aufeinanderfolgenden ganzen Zahlen in jeder Gruppe in r erweitern. Kann jemand Hinweise auf dieses Problem haben?Wie man einen Vektor von ganzen Zahlen in aufeinanderfolgende ganze Zahlen in jeder Gruppe in r

Unten ist mein Original-Datensatz:

x = c(1, 2, 3, 4, 5, 1, 3, 5, 6, 1, 2, 3, 6, 8) 
group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3) 
data = data.frame(x, group) 

und meine gewünschten Datensatzes ist wie folgt:

desired_data = data.frame(
    x = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8), 
group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3)) 

Vielen Dank für Ihre Hilfe!

Antwort

4

Dies kann

library(tidyverse) 

df %>% 
group_by(group) %>% 
expand(x = full_seq(x, 1)) 

über expand von tidyr, leicht gemacht werden, die

# A tibble: 19 x 2 
# Groups: group [3] 
    group  x 
    <dbl> <dbl> 
1  1  1 
2  1  2 
3  1  3 
4  1  4 
5  1  5 
6  2  1 
7  2  2 
8  2  3 
9  2  4 
10  2  5 
11  2  6 
12  3  1 
13  3  2 
14  3  3 
15  3  4 
16  3  5 
17  3  6 
18  3  7 
19  3  8 
+0

Danke Sotos. Ihre Antwort ist sehr kurz und nützlich. Dieser Code funktioniert jedoch nicht, wenn eine Datengruppe mit einer Zahl größer als 1 beginnt. In diesem Fall kann expand nicht zu einer vollständigen Sequenz von 1 bis zur Maximalzahl x erweitert werden. Hast du irgendwelche Ideen, diesen Fehler zu beheben? –

+1

Ich habe das herausgefunden. Der folgende Code funktioniert besser, wenn eine Gruppe von x mit einer Ganzzahl größer als 1 beginnt. 'Data%>% group_by (group)%>% expand (x = full_seq (1: max (x), 1))' –

1

ich bald eine sauberere Lösung wird jemand sicher bin, gibt. In der Zwischenzeit:

minVals=aggregate(data$x, by = list(data$group), min)[,2] 
maxVals=aggregate(data$x, by = list(data$group), max)[,2] 
ls=apply(cbind(minVals,maxVals),1,function(x) x[1]:x[2]) 

desired_data = data.frame(
    x = unlist(ls), 
    group = rep(unique(data$group),lapply(ls,length))) 

    x group 
1 1  1 
2 2  1 
3 3  1 
4 4  1 
5 5  1 
6 1  2 
7 2  2 
8 3  2 
9 4  2 
10 5  2 
11 6  2 
12 1  3 
13 2  3 
14 3  3 
15 4  3 
16 5  3 
17 6  3 
18 7  3 
19 8  3 
1

Hier ist eine Basis R-Lösung.

x = c(1, 2, 3, 4, 5, 1, 3, 5, 6, 1, 2, 3, 6, 8) 
group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3) 

sl = split(x,group) 

expanded = lapply(names(sl),function(x){ 
    r = range(sl[[x]]) 
    return(data.frame(x = seq(r[1],r[2],1),group = x)) 
}) 

do.call(rbind,expanded) 
  • Split-x von der Gruppe, die pro Gruppe in einer benannten Liste führt
  • mit lapply auf den Namen können wir die ganze Zahl für jede Gruppe
  • schließlich do.call zusammen, um die Ergebnisse rbind verwenden erweitern.
Verwandte Themen