在R中过滤分组数据

我想知道是否有人可以帮助分组下面的数据,因为我试图使用子集函数来筛选出低于某个阈值的卷,但是如果数据表示的是对象组,则会产生删除某些项目的问题被保存。

在F栏(和I)你可以看到蓝色,红色和黄色的物体。 每个代表一个DNA链上的三个独立的彩色探针。 奇数或无数蓝色,红色和黄色与由偶数编号的蓝色,红色和黄色表示的同源链配对。 即行2,3和4中的数据是一个“组”并且与行5,6和7中所示的“组”相对应。然后重复,所以8,9,10是一个新组,并且该组对与11,12,13。

我想要做的是将这些小组进行分组,以便只保留那些距离中点一定距离(列M)的小组。 这里的中点是连接一个组的蓝色和它的伙伴的蓝色的线的中点,所以这个子组只应用于蓝色距离到中点,这就是我遇到问题的地方。 例如,如果我要求保持到中点的蓝色距离小于3,那么第3行和第4行中的对象应该保留,因为它们是蓝色距离小于3的组的一部分。现在虽然当我用子集function我失去了红色select和黄色select。 我相信在R中有一个直接的解决scheme,但是如果有人通过这条路线有任何build议的话,我也可以在excel中进行一些types的过滤。

编辑我设法在发布问题后昨晚在Excel中工作。 解决scheme不是很漂亮,但它工作得很好。 我刚刚在“到中点的距离”旁边添加了一个新的列,使得一个组中的所有对象具有相同的距离,所以当我过滤数据时,我不会丢失任何不应该的对象。 如果以后有人帮助,我在Excel中使用的公式是:

=SQRT ( ((INDEX($B$2:$B$945,1+QUOTIENT(ROWS(B$2:B2)-1,3)*3))- (INDEX($O$2:$O$945,1+QUOTIENT(ROWS(O$2:O2)-1,3)*3)) ) ^2 +( (INDEX($C$2:$C$945,1+QUOTIENT(ROWS(C$2:C2)-1,3)*3))-(INDEX($P$2:$P$945,1+QUOTIENT(ROWS(P$2:P2)-1,3)*3)) ) ^2 +( (INDEX($D$2:$D$945,1+QUOTIENT(ROWS(D$2:D2)-1,3)*3))-(INDEX($Q$2:$Q$945,1+QUOTIENT(ROWS(Q$2:Q2)-1,3)*3)) ) ^2) 

在这里输入图像说明

用一个可重复的例子会更容易,但是这里有一个(hacky) plyr解决scheme:

 filterframe<-function(df,threshold){ df$grouper<-rep(seq(from=1,to=6),nrow(df)/6) dataout<-df%>%group_by(grouper)%>%summarise(keep=.[[1]]$distance_to_midpoint<threshold) dataout[dataout$keep,] } filterframe(mydata) 

下面提供了一个基础R解决scheme 这个想法是,一旦你的数据在R,你(编辑)保持! 行,如果他们符合2条件。 首先, Surpass列中必须包含“blue”这个词,这是用grepl函数完成的。 其次,距离必须低于一定的门槛(由门槛任意设定。

 fakeData=data.frame(Surpass=c('blue', 'red', 'green', 'blue'), distance=c(1,2,5,3), num=c(90,10,9,4)) #thresh is your distance threshold thresh = 2 fakeDataNoBlue = fakeData[which(grepl('blue', fakeData$Surpass) & fakeData$distance < thresh),] 

也许还有一个使用filter的快速dplyr解决scheme,但是我还没有完全探索那里的function。 另外,如果您还想保留其他颜色,我可能会有些困惑。 如果是这样,就像说你想删除超过一定距离阈值的蓝色,你只需要做一个命令,然后把<运算符变成一个>运算符。