在R中自定义排序数据帧

时间:2014-12-15 22:29:43

标签: r sorting dataframe

我有一个如下所示的binomail数据集:

df <- data.frame(replicate(4,sample(1:200,1000,rep=TRUE)))
addme <- data.frame(replicate(1,sample(0:1,1000,rep=TRUE)))
df <- cbind(df,addme)
df <-df[order(df$replicate.1..sample.0.1..1000..rep...TRUE..),]

目前,数据以一种方式进行分析,以显示属于0组的实例,然后显示属于1组的实例。有没有办法以0-1-0-1-0的方式对数据进行排序?我的意思是显示属于0组的行,属于1组的行然后是零组等等......

我能想到的只有复杂的功能。我希望有一个简单的方法。

谢谢,

2 个答案:

答案 0 :(得分:3)

这是一次尝试,最后会添加额外的1:

首先制作一些示例数据:

set.seed(2)
df <- data.frame(replicate(4,sample(1:200,10,rep=TRUE)),
                              addme=sample(0:1,10,rep=TRUE))

然后订购:

with(df, df[unique(as.vector(rbind(which(addme==0),which(addme==1)))),])

#    X1  X2  X3  X4 addme
#2  141  48  78  33     0
#1   37 111 133   3     1
#3  115 153 168 163     0
#5  189  82  70 103     1
#4   34  37  31 174     0
#6  189 171  98 126     1
#8  167  46  72  57     0
#7   26 196  30 169     1
#9   94  89 193 134     1
#10 110  15  27  31     1
#Warning message:
#In rbind(which(addme == 0), which(addme == 1)) :
#  number of columns of result is not a multiple of vector length (arg 1)

答案 1 :(得分:3)

这是使用dplyr的另一种方式,这将使其适用于组内排序。它也可能很快。如果有0和1的不平衡数字,它将留在最后。

library(dplyr)
df %>% 
    arrange(addme) %>%
    mutate(n0 = sum(addme == 0),
           orderme = seq_along(addme) - (n0 * addme) + (0.5 * addme)) %>%
    arrange(orderme) %>%
    select(-n0, -orderme)