2017-07-17 7 views
0

Daten:Sortieren Spalten nach Jahren unabhängig in einem Datenrahmen in R

set.seed(0) 
Temp <- data.frame(year=rep(1:3,each=4),V1=floor(rnorm(12)*2),V2=floor(rnorm(12)*2)) 

    year V1 V2 
1  1 2 -3 
2  1 -1 -1 
3  1 2 -1 
4  1 2 -1 
5  2 0 0 
6  2 -4 -2 
7  2 -2 0 
8  2 -1 -3 
9  3 -1 -1 
10 3 4 0 
11 3 1 0 
12 3 -2 1 

Ich möchte V1 und V2 innerhalb jedes Jahr unabhängig neu zu ordnen. Ich kann es mit 10 Zeilen machen, aber ich glaube, dass es einen schöneren Weg geben muss, es zu tun.

gewünschte Ausgabe:

year V1 V2 
1  1 -1 -3 
2  1 2 -1 
3  1 2 -1 
4  1 2 -1 
5  2 -4 -3 
6  2 -2 -2 
7  2 -1 0 
8  2 0 0 
9  3 -2 -1 
10 3 -1 0 
11 3 1 0 
12 3 4 1 
+0

Für Abwechslung ist eine Basis R Option 'Reduce (rbind, lapply (split (Temp, Temp $ year), Funktion on (x) data.frame (lapply (x, sort)))) '. Dies verwendet eine verschachtelte Schleife (mit 'lapply'). – lmo

Antwort

2

dplyr Verwenden Sie

library(dplyr) 
Temp %>% 
    group_by(year) %>% 
    mutate(V1=sort(V1), V2=sort(V2)) 

tun können, die

# A tibble: 12 x 3 
# Groups: year [3] 
    year V1 V2 
    <int> <dbl> <dbl> 
1  1 -1 -3 
2  1  2 -1 
3  1  2 -1 
4  1  2 -1 
5  2 -4 -3 
6  2 -2 -2 
7  2 -1  0 
8  2  0  0 
9  3 -2 -1 
10  3 -1  0 
11  3  1  0 
12  3  4  1 
zurück

Und wenn Sie mit allen Spalten benötigt, um das zu tun, könnten Sie

Temp %>% 
    group_by(year) %>% 
    mutate_all(sort) 
+0

So einfach, schön. Ich musste 'mutate_all (Spaß (sort (., Na.last = T)))' 'verwenden – Tunn

1

Mit data.table:

library(data.table) 
setDT(Temp)[,c("V1","V2"):=list(sort(V1),sort(V2)),year] 
+0

@MrFlick danke. gerade jetzt behoben, es ist genau das gleiche wie Ihre Lösung, wriiten innerhalb der data.table Kontext – agstudy

0

tun Wenn Sie plyr verwenden, und Sie kennen die Spaltennamen, können Sie einfach diese ddply mit tun:

library(plyr) 
ddply(Temp, "year", summarize, V1=sort(V1), V2=sort(V2)) 
    year V1 V2 
1  1 -1 -3 
2  1 2 -1 
3  1 2 -1 
4  1 2 -1 
5  2 -4 -3 
6  2 -2 -2 
7  2 -1 0 
8  2 0 0 
9  3 -2 -1 
10 3 -1 0 
11 3 1 0 
12 3 4 1 

wenn Sie nicht die Spaltennamen kennen, würden Sie eine Funktion machen müssen, es zu tun:

> ddply(Temp, "year", function(x) { as.data.frame(lapply(x, sort)) }) 
    year V1 V2 
1  1 -1 -3 
2  1 2 -1 
3  1 2 -1 
4  1 2 -1 
5  2 -4 -3 
6  2 -2 -2 
7  2 -1 0 
8  2 0 0 
9  3 -2 -1 
10 3 -1 0 
11 3 1 0 
12 3 4 1 
Verwandte Themen