2016-12-07 55 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