2016-12-07 56 views
1

将ordner行可以说,我有行的DS:跳跃/交替顺序,在数据帧

cat 
dog 
lion 
miau 
wuff 
roarr 

我想订购他们在一个序列

cat 
miau 
dog 
wuff 
lion 
roarr 

为了做到这一点我需要用序列

1 4 2 5 3 6 

让我们用任意N更一般的例子来订购它:

n <- 10 

ds < data.frame(col=c(paste0(letters[1:n],1),paste0(letters[1:n],2)),stringsAsFactors = F) 

ds[,] <- ds[mySeq,] 

如何为所有类型的n生成序列(mySeq)?

> ds 
    col 
1 a1 
2 b1 
3 c1 
4 d1 
5 e1 
6 f1 
7 g1 
8 h1 
9 i1 
10 j1 
11 a2 
12 b2 
13 c2 
14 d2 
15 e2 
16 f2 
17 g2 
18 h2 
19 i2 
20 j2 
> 

编辑: 我能想象到拉链序列1:(nrow(DS)/ 2)和(nrow(DS)/ 2 + 1):nrow(DS)。 所以如果n变高,我需要压缩很多seqs。不太实际。

的gtools mixedsort()的 “随机” 行不会工作:

set.seed(1337) 
MHmakeRandomString <- function(n=1, lenght=12) 
{ 
    randomString <- c(1:n)     # initialize vector 
    for (i in 1:n) 
    { 
    randomString[i] <- paste(sample(c(0:9, letters, LETTERS), 
            lenght, replace=TRUE), 
          collapse="") 
    } 
    return(randomString) 
} 

ds <- data.frame(col=c(paste0(MHmakeRandomString(n),1),paste0(MHmakeRandomString(n),2)),stringsAsFactors = F) 

dso <- mixedsort(ds) 

我想我需要一个序列!

我更新了我的第一个小例子!

+1

'DS $ COL [顺序(GSUB(\\ d +', '',DS $ COL))]' – Sotos

回答

1

这里的另一种方法,尝试基于它的基本模式来生成的数字序列。这意味着没有字符串操作。

sequence_generator <- function(n, nrow){ 
    base_seq=rep(1:n,each=nrow/n) 
    res=base_seq+seq(0,(nrow/n)-1)*n 
    res 
} 

sequence_generator(3,6) 
# [1] 1 4 2 5 3 6 
sequence_generator(10,20) 
#[1] 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20 
+0

谢谢。这是我正在寻找的。这是一个每次都能正常工作的解决方案。如果任何人有一个较短的版本,我很高兴看到。 –

+0

“较短版本”是什么意思?它可以写成一个oneliner,但我把它放到一个函数中用于演示目的。 – Heroka

+0

n可以从参数列表中取出并定义为n < - nrow/2 –

0

我们可以使用sub

ds[order(sub("\\D+", "", ds[,1])), , drop = FALSE] 
+1

我想OP需要它为'A1,B1,A2,b2'等如果我没有错, –

+1

恰恰是我一读到问题就想到的。 – Sotos

+1

该方法不会使用“随机”字符串。 –

0

如何:

n <- 10 
ds <- data.frame(col=c(paste0(letters[1:n],1), paste0(letters[1:n],2)), stringsAsFactors = F) 
mySeq <- order(substr(ds$col,1,1), substr(ds$col,2,2)) 
ds <- ds[mySeq,] 
+0

您再次使用“干净”字母。看看我的编辑与随机字符串: –

+0

但你想要什么与这些随机行?他们最终应该如何排序?只是最后一个字符? – mpjdem

+0

@AndreElrico在这种情况下'mySeq < - order(substr(ds $ col,nchar(ds $ col),nchar(ds $ col)))'将会做 – mpjdem