R按列中的数字对数据进行分组

R grouping data by numeric numbers in a column

我正在尝试按列中的数字对数据进行分组,我尝试了不同版本的 group_by、cut、group 等,但我没能得到它。 我有很多这样的数据:

  position variants

     3      snv
     5      snv
    12      snv
    17      mnv
    22 deletion
    27      snv
    33      snv
    35      snv
    42      snv
    46      mnv
    50      snv
    53 deletion
    60      snv
    62      snv
    65      snv
    70      snv
variants <- c(rep("snv", 3),rep("mnv", 1),rep("deletion", 1),rep("snv", 4), "mnv", rep("snv"), "deletion", rep("snv", 4))
variants              
position = c(3, 5, 12, 17, 22, 27, 33, 35, 42, 46, 50, 53, 60, 62, 65, 70)
position
patient1 = data.frame(position, variants)
patient1

我希望能够对数据进行分组 像这样:

group  tally
1-10    2snv
11-20   1snv 1mnv
21-30   1deletion 1snv
31-40   2snv 
etc

这样我就可以运行进一步的下游分析。 并能够将其更改为 1-5 或 1-2 等组 非常感谢

我们可以用tidvyerse进行分组操作。创建一组范围 cutsummarise 基于 cut 和 'variants' 的频率计数,然后 paste 它们一起在 summarise

library(dplyr)
patient1 %>% 
   group_by(group = cut(position, breaks = c(-Inf, seq(1, 100, 
       by = 10))), variants) %>%
   summarise(n = n()) %>%
   summarise(tally = paste(n, variants, collapse=' ', sep=""))

注意:另一个选项是 findInterval,它与 cut 的选项类似,但没有 labels,因为它将输出数字索引

这里是纯 R 解决方案。当然你可以通过相应的调用来替换变量:

variants <- c(rep("snv", 3),rep("mnv", 1),rep("deletion", 1),rep("snv", 4), "mnv", rep("snv"), "deletion", rep("snv", 4))
position = c(3, 5, 12, 17, 22, 27, 33, 35, 42, 46, 50, 53, 60, 62, 65, 70)
patient1 = data.frame(position, variants)

labels = cut(position, seq(0, max(position), 10))
groups = split(patient1 , labels)
lapply(groups , function(x) {
  paste( table(x$variants), names(table(x$variants)), collapse = ", " )
      }
  )

在 base R 中,您可以使用 findInterval 创建一个组列,每 10 个位置进行分组。然后我们可以使用 aggregate 并将 variants 的计数与 variants 相结合,为每个组创建一个字符串。

patient1$group <- with(patient1, findInterval(position, (seq(0, max(position), 10))))

aggregate(variants~group, patient1, function(x) {
  tb <- table(x)
  paste(tb, names(tb), collapse = ' ')
})

#  group         variants
#1     1            2 snv
#2     2      1 mnv 1 snv
#3     3 1 deletion 1 snv
#4     4            2 snv
#5     5      1 mnv 1 snv
#6     6 1 deletion 1 snv
#7     7            3 snv
#8     8            1 snv