2017-07-17 43 views
0

數據:順序列逐年獨立的數據幀中的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 

我想每個年度內獨立重新排序V1和V2。我可以用10行來完成,但我相信必須有更美麗的方式才能做到。

所需的輸出:

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

對於品種,一個基本的R選項是'Reduce(rbind,lapply(split(Temp,Temp $ year ),功能on(x)data.frame(lapply(x,sort))))'。這使用了一個嵌套循環(帶有'lapply')。 – lmo

回答

2

使用dplyr你可以做

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

返回

# 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 

如果你需要做的是與所有列,你可以做

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

這麼簡單,很好。我不得不使用'mutate_all(funs(sort(。,na.last = T)))'' – Tunn

1

使用data.table

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

@MFFlick謝謝。只是現在就修好了,它和你的解決方案一樣,在data.table的環境下工作。 – agstudy

0

如果使用plyr,你知道的列名,你可以很容易地做到這一點使用ddply:

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 

如果你不知道列名,你必須做一個函數來做到這一點:

> 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