首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不同的bin中剪切一个数字,并用新的bin扩展数据框?

如何在不同的bin中剪切一个数字,并用新的bin扩展数据框?
EN

Stack Overflow用户
提问于 2017-01-19 08:13:07
回答 2查看 89关注 0票数 0

我想计算一些非常简单的东西,但我找不到解决方案。我想要削减某些数量的垃圾桶,但我想节省这些垃圾桶。

代码语言:javascript
复制
bin.size = 100 
df = data.frame(x =c(300,400), 
                y = c("sca1","sca2"))
cut(df$x, seq(0, 400, bin.size), 
    include.lowest = TRUE)

给了我

代码语言:javascript
复制
[1] (200,300] (300,400]
Levels: [0,100] (100,200] (200,300] (300,400]

但我想要的是这样的:

代码语言:javascript
复制
        bin    y
1   (0,100] sca1
2 (100,200] sca1
3 (200,300] sca1
4   (0,100] sca2
5 (100,200] sca2
6 (200,300] sca2
7 (300,400] sca2

我之所以这样做,是因为我想计算输入到100个存储箱中的值的数量。例如:

代码语言:javascript
复制
df2 = data.frame(snp = c(1,2,10,100,1,2,14,16,399), 
                 sca = c("sca1","sca1","sca1","sca1","sca2","sca2","sca2","sca2","sca2"))
df2
  snp  sca
1   1 sca1
2   2 sca1
3  10 sca1
4 100 sca1
5   1 sca2
6   2 sca2
7  14 sca2
8  16 sca2
9 399 sca2

单核苷酸多态性可能是载体sca1中的位置。

最终目标是获得如下所示:

代码语言:javascript
复制
        bin    y num
1   (0,100] sca1   4
2 (100,200] sca1   0
3 (200,300] sca1   0
4   (0,100] sca2   4
5 (100,200] sca2   0
6 (200,300] sca2   0
7 (300,400] sca2   1

我能做的最好的事情是:

代码语言:javascript
复制
df2$cat = cut(df2$snp, seq(0, 400, bin.size), 
include.lowest = TRUE)
df2
  snp  sca       cat
1   1 sca1   [0,100]
2   2 sca1   [0,100]
3  10 sca1   [0,100]
4 100 sca1   [0,100]
5   1 sca2   [0,100]
6   2 sca2   [0,100]
7  14 sca2   [0,100]
8  16 sca2   [0,100]
9 399 sca2 (300,400]

或者这样:

代码语言:javascript
复制
table(df2$cat,df2$sca)
            sca1 sca2
  [0,100]      4    4
  (100,200]    0    0
  (200,300]    0    0
  (300,400]    0    1

但最后一次尝试的问题是,类别(300,400]sca1没有意义,因为它不存在。它应该是NA或不出现。如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-19 09:49:30

下面是使用tidyverse中的几个包的一种方法

代码语言:javascript
复制
library(dplyr)
library(tidyr)
library(purrr)

df %>%
  left_join(nest(df2, snp, .key = "snp"), by = c("y" = "sca")) %>%
  mutate(
    cuts = map(x, ~ seq(0, ., by = 100)),
    tbls = pmap(
      .l = list(snp, cuts),
      .f = function(xx, breaks) {
        z <- table(cut(xx$snp, breaks))
        data_frame(cut = names(z), count = z)
      }
    )
  ) %>%
  select(y, tbls) %>%
  unnest()
#      y       cut count
# 1 sca1   (0,100]     4
# 2 sca1 (100,200]     0
# 3 sca1 (200,300]     0
# 4 sca2   (0,100]     4
# 5 sca2 (100,200]     0
# 6 sca2 (200,300]     0
# 7 sca2 (300,400]     1
票数 2
EN

Stack Overflow用户

发布于 2017-01-19 09:59:04

在基数R中:

代码语言:javascript
复制
data.frame(table(cat=cut(df2$snp, seq(0,400,100)),sca=df2$sca))

#       cat   sca Freq
#1   (0,100] sca1    4
#2 (100,200] sca1    0
#3 (200,300] sca1    0
#4 (300,400] sca1    0
#5   (0,100] sca2    4
#6 (100,200] sca2    0
#7 (200,300] sca2    0
#8 (300,400] sca2    1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41731684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档