我有一个如下所示的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组的行然后是零组等等......
我能想到的只有复杂的功能。我希望有一个简单的方法。
谢谢,
答案 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)