如何根据r中数值变量的间隔将数据帧拆分为子组
我有一个数据帧(如何根据r中数值变量的间隔将数据帧拆分为子组,r,R,我有一个数据帧(df),看起来像: mi chr gen.pos m4774 Ch01 0 m4775 Ch01 1.701 m4663 Ch01 5.519 m4777 Ch01 6.5 m4779 Ch01 11.067 m4780 Ch01 11.234 m3933 Ch01 11.449 m4782 Ch01 13.986 m5534 Ch01 119.277 m5536 Ch
df
),看起来像:
mi chr gen.pos
m4774 Ch01 0
m4775 Ch01 1.701
m4663 Ch01 5.519
m4777 Ch01 6.5
m4779 Ch01 11.067
m4780 Ch01 11.234
m3933 Ch01 11.449
m4782 Ch01 13.986
m5534 Ch01 119.277
m5536 Ch02 0.036
m5550 Ch02 4.26
将chr
列作为组,首先,通过此代码获得每组gen.pos
列的20个箱子的间隔:
len <- as.data.frame(cbind(chr = unique(df$chr),
do.call(rbind, tapply(df$gen.pos, df$chr, function(x) {c(min = min(x), max = max(x))}))))
len$interval <- format(round((as.numeric(as.character(len$max))-as.numeric(as.character(len$min)))/20,3),nsmall=3)
我的任务是在df
中创建一个名为bin
的列,为每个组的gen.pos
间隔分配索引。例如,第一个箱子1
分配给0~5.964
范围gen.pos
,2
分配给5.965~11.928
(5.964*2=11.928
)。。。
最终结果如下:
mi chr gen.pos bin
m4774 Ch01 0 1
m4775 Ch01 1.701 1
m4663 Ch01 5.519 1
m4777 Ch01 6.5 2
m4779 Ch01 11.067 2
m4780 Ch01 11.234 2
m3933 Ch01 11.449 2
m4782 Ch01 13.986 3
m5534 Ch01 119.277 20
m5536 Ch02 0.036 1
m5550 Ch02 4.26 1
len
数据帧输出是不必要的。它只是用来更清楚地描述我的问题。感谢您的帮助。len
是一个重要的光标,所以为了清晰起见,我在这里复制了您的内容
library(dplyr)
len <- df %>%
group_by(chr) %>%
summarize(min=min(gen.pos), max=max(gen.pos), interval= (max-min)/20)
将生成所需的具有awesome dplyr的列。(您可以使用
select
命令删除过时的列)错误:>len%groupby(chr)%%>%summary(min=min(gen.pos)、max=max(gen.pos)、interval=(max-min)/20)错误:找不到函数“%%>%”安装。软件包(“dplyr”)将dplyr与magrittr一起安装。让我的编码变得有趣。
library(dplyr)
len <- df %>%
group_by(chr) %>%
summarize(min=min(gen.pos), max=max(gen.pos), interval= (max-min)/20)
df %>%
group_by(chr) %>%
mutate(max = max(gen.pos),
min = min(gen.pos),
width = (max-min)/20,
bin1 = ceiling((gen.pos-min)/width),
bin = ifelse(gen.pos==min, bin1 + 1, bin1)
)