首页 > 解决方案 > 根据多个范围对数据框进行子集化,并将每个范围保存为列表中的元素

问题描述

我想根据属于多个范围的值将数据框制作为列表,以便每个值属于每个范围成为该列表中的一个元素。例如,如果我有 10 个范围和 nrow=n 的数据框,那么我将获得 10 个数据框的列表。

数据

df<- data.frame(x=seq(33, 37, 0.12), y=seq(31,35, 0.12))
library(data.table)
range<- data.table(start  =c(36.15,36.08,36.02,35.95,35.89,35.82,35.76,35.69),
                   end = c(36.08,36.02,35.95,35.89,35.82,35.76,35.69,35.63))

我试过了

nlist<-list(
     df[which(df$x>36.15),],
     df[which(df$x<=36.15 & df$x>36.08),],
     df[which(df$x<=36.08 & df$x>36.02),],
     df[which(df$x<=36.02 & df$x>35.95),],
     df[which(df$x<=35.95 & df$x>35.89),],
     df[which(df$x<=35.89 & df$x>35.82),],
     df[which(df$x<=35.82 & df$x>35.76),],
     df[which(df$x<=35.76 & df$x>35.69),],
     df[which(df$x<=35.69 & df$x>35.63),],
     df[which(df$x <= 35.63),])

有两个问题。首先,我想循环而不是编写每个范围限制的值。其次,这段代码:

Reduce('+', lapply(nlist, nrow))

产生行的总和 = 35,而我的数据框有 nrow = 34。这个额外的值来自哪里?

标签: rlistrange

解决方案


您可以应用范围对象的行

apply(range, 1, function(z) df[df$x > z[2] & df$x <= z[1],])

推荐阅读