【问题标题】:jumping / alternating sequence that will ordner rows in dataframe跳跃/交替序列,将排序数据框中的行
【发布时间】:2016-12-07 09:50:59
【问题描述】:

假设我有一个带行的 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 变高,我需要压缩很多序列。不太实用。

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)

我想我确实需要那个序列!

我更新了我的第一个迷你示例!

【问题讨论】:

  • ds$col[order(gsub('\\D+', '', ds$col))]

标签: r sequence seq


【解决方案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

【讨论】:

  • 谢谢。这就是我一直在寻找的。那是一个通用的解决方案,每次都有效。如果有人有更短的版本,我很高兴看到。
  • “更短的版本”是什么意思?可以写成oneliner,但我把它放到一个函数中用于演示。
  • n 可以从参数列表中取出并定义为 n
  • 并非如此,因为在这种情况下,n 是“块”的数量。因此,它可以是任何值。
【解决方案2】:

我们可以使用sub

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

【讨论】:

  • 如果我没记错的话,我猜 OP 需要它作为 a1,b1,a2,b2
  • @AndreElrico 您之前展示了一个示例,这适用于该示例。如果您想继续更改您的帖子,请继续这样做。我没有说它适用于所有情况
  • 对不起,我应该写,我正在寻找一个通用的解决方案,无论行中的内容是什么,每次都有效!
  • @AndreElrico 如果您正在寻找一般情况,元素的数量也应该是随机的而不是固定的
【解决方案3】:

怎么样:

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,]

【讨论】:

  • 你又在使用“干净”的字母了。用随机字符串查看我的编辑:
  • 但是您到底想要这些随机行做什么?那么他们最终应该如何分类呢?就在最后一个字符?
  • @AndreElrico 在这种情况下mySeq &lt;- order(substr(ds$col,nchar(ds$col),nchar(ds$col))) 会做
猜你喜欢
  • 2018-08-26
  • 2022-12-04
  • 2010-11-20
  • 1970-01-01
  • 2016-01-26
  • 2014-02-18
  • 2021-07-02
相关资源
最近更新 更多