【问题标题】:Grouping first few rows with positive value followed by another group with negative values and so on using R使用 R 将前几行分组为正值,然后是另一组为负值,依此类推
【发布时间】:2021-06-15 19:37:10
【问题描述】:

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

name       strand

thrL       1

thrA       1

thrB       1

yaaA       -1

yaaJ       -1

talB       1

mog        1

我想将前几个正值分组,将负值分组,下一个正数作为另一个组,如下所示:

name       strand     directon

thrL       1           1

thrA       1           1

thrB       1           1

yaaA       -1          2

yaaJ       -1          2

talB       1           3

mog        1           3

我正在考虑使用 dplyr,但我需要一些关于使用 R 的代码的帮助。非常感谢。

【问题讨论】:

标签: r dplyr grouping ranking


【解决方案1】:

使用rle

df$direction <- with(rle(sign(df$strand)), rep(seq_along(values), lengths))
df

#  name strand direction
#1 thrL      1         1
#2 thrA      1         1
#3 thrB      1         1
#4 yaaA     -1         2
#5 yaaJ     -1         2
#6 talB      1         3
#7  mog      1         3

这可以用data.tablerleid缩短。

df$direction <- data.table::rleid(sign(df$strand))

【讨论】:

  • 如果 strand 列只包含 + 和 - 号怎么办?
  • 那么你可以使用rle而不使用sign,即df$direction &lt;- with(rle(df$strand), rep(seq_along(values), lengths))
【解决方案2】:

我们也可以这样做

df1$direction <- inverse.rle(within.list(rle(sign(df1$strand)),
         values <- seq_along(values)))
df1$direction
#[1] 1 1 1 2 2 3 3

数据

df1 <- structure(list(name = c("thrL", "thrA", "thrB", "yaaA", "yaaJ", 
"talB", "mog"), strand = c(1L, 1L, 1L, -1L, -1L, 1L, 1L)), 
class = "data.frame", row.names = c(NA, 
-7L))

【讨论】:

  • 如果 strand 列只包含 + 和 - 号怎么办?
  • @JennyEmpawi 那么你可以做rle(df1$strand == "+")
猜你喜欢
  • 1970-01-01
  • 2018-11-13
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多