2012-03-08 99 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