R排序/排序堆叠变量

时间:2012-03-08 18:25:58

标签: r sorting dataframe

非常相似:How to sort dataframe in R with specified column order preservation?

我的数据示例:

> 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")

3 个答案:

答案 0 :(得分:1)

如果我很清楚你想做什么,你可以使用:

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

基本上这是做什么的:

  1. 选择type = x1

    的数据

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

  2. 获取y1的顺序并将其放入ord

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

  3. 订购您的(部分)数据

    dat[ord,]

  4. 将其余数据排序为第一部分
    注意:仅当前4个元素为x1且第2个4为x2

    时才有效

    dat[ord+4,]

  5. 将其与有序数据合并

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

答案 1 :(得分:1)

以下是三个步骤的解决方案:

  1. xtabs将您的data.frame转换为2D数组(表格):attr - by - type
  2. 沿attr维度
  3. 对数组进行排序
  4. 使用as.data.frame.table
  5. 返回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
    

答案 2 :(得分: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