2012-03-08 102 views
0

很相似:How to sort dataframe in R with specified column order preservation?[R排序/順序堆積變量

我的數據的一個例子:

> dat 
    type attr y1 
1 x1   A 0.25 
2 x1   B 0.19 
3 x1   C 0.06 
4 x1   D 0.13 
5 x2   A 0.25 
6 x2   B 0.00 
7 x2   C 0.19 
8 x2   D 0.00 

我創建了幾個不同的情節和希望做到以下幾點:

  • 按y1排序,但僅根據x1的y1值
  • 按照attr在執行完上一步之後的任何順序排列本身的x2順序

換句話說,在這個例子中,我想要的結果:

> datsorted 
    type attr y1 
1 x1   C 0.06 
2 x1   D 0.13 
3 x1   B 0.19 
4 x1   A 0.25 
5 x2   C 0.19 
6 x2   D 0.00 
7 x2   B 0.00 
8 x2   A 0.25 

我現在知道這樣做是瘋狂繁瑣的唯一途徑。我根據type(一個用於x1,一個用於x2)的值創建了兩個子集數據框。然後,我創建了一個新的數據幀是這樣的:

> beside 
    t1 t2 attr x1y1 x2y1 
1 x1 x2 A  0.25 0.25 
2 x1 x2 B  0.19 0.00 
3 x1 x2 C  0.06 0.19 
4 x1 x2 D  0.13 0.00 

這樣我可以通過X1Y1排序,並把一切都在一起......但後來我不得不重新拆分了它在長期的形式情節。一定有更好的方法。對不起,如果我錯過了另一個答案;我比較新的R,我甚至不知道要搜索什麼!


每下面的建議,這裏的原始數據:

> dput(dat) 
structure(list(type = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L), .Label = c("x1", "x2"), class = "factor"), attr = structure(c(1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), 
    y1 = c(0.25, 0.19, 0.06, 0.13, 0.25, 0, 0.19, 0)), .Names = c("type", 
"attr", "y1"), row.names = c(NA, -8L), class = "data.frame") 

回答

1

如果我沒有理解好你想要做什麼,你可以使用:

ord <- order(dat[dat$type=="x1",]$y1) 
dat.sorted <- rbind(dat[ord,], dat[ord + 4,]) 

從本質上講這是什麼做是:

  1. selecti納克的數據,其中類型= X1

    dat[dat$type=="x1",]

  2. 獲得在這些Y1的順序,並把它在ord

    order(dat[dat$type=="x1",]$y1)

  3. 順序的(局部的)數據

    dat[ord,]

  4. 訂貨數據的其餘部分作爲第一部分
    注意:這隻能如果前4個元素是x1和2號4×2

    dat[ord+4,]

  5. 與有序數據

    合併它

    dat.sorted <- rbind(dat[ord,], dat[ord+4,])

+0

感謝協助。我簡化了上面的內容,並按要求添加了「dput(dat)」。我會問,但現在知道答案後,試試這個,「什麼排序數據的第二部分不是x1?」我在第二張表格中沒有輸入錯誤信息,顯示我希望如何分類。我想按x1的y1變量排序,這會給我一個'attr'向量的順序;那麼我想按照「attr」排序順序對x2進行排序。不過,我想我可以使用你的代碼來做到這一點。稍等片刻。 – Hendy 2012-03-08 18:54:01

+0

沒有。沒有得到它。我需要在上半場告訴我,把'attrs'放到(C,D,B,A)結束的順序是什麼?那麼我需要那個下半部分來訂購它自己。現在,你的函數給了我x1'attrs'的順序C,D,B,A,但是x2在原來的A,B,C,D順序中堆疊在它下面。希望這是有道理的。 – Hendy 2012-03-08 19:01:24

+0

@ Hendy:ahhh ...好的,現在我明白了,我會編輯我的答案 – nico 2012-03-08 20:41:52

1

以下是在三個步驟中的溶液:

  1. xtabs將您data.frame成2D陣列(表):attr -by- type
  2. 排序沿attr維陣列
  3. 返回到使用as.data.frame.table
一個data.frame
a <- xtabs(y1 ~ attr + type, dat) 
a 
#  type 
# attr x1 x2 
# A 0.25 0.25 
# B 0.19 0.00 
# C 0.06 0.19 
# D 0.13 0.00 

b <- a[order(a[, "x1"]), ] 
b 
#  type 
# attr x1 x2 
# C 0.06 0.19 
# D 0.13 0.00 
# B 0.19 0.00 
# A 0.25 0.25 

as.data.frame.table(b, responseName = "y") 
# attr type y 
# 1 C x1 0.06 
# 2 D x1 0.13 
# 3 B x1 0.19 
# 4 A x1 0.25 
# 5 C x2 0.19 
# 6 D x2 0.00 
# 7 B x2 0.00 
# 8 A x2 0.25 
1

從子集typex1

dat.x1 <- subset(dat, type == "x1") 

找到相應增加的y1值的屬性:

ord.attr <- dat.x1$attr[order(dat.x1$y1)] 
ord.attr 
# [1] C D B A 
# Levels: A B C D 

然後用ply'r arrange功能整理你的data.frame:

require(plyr) 
arrange(dat, type, match(attr, ord.attr)) 
# type attr y1 
# 1 x1 C 0.06 
# 2 x1 D 0.13 
# 3 x1 B 0.19 
# 4 x1 A 0.25 
# 5 x2 C 0.19 
# 6 x2 D 0.00 
# 7 x2 B 0.00 
# 8 x2 A 0.25