过滤R

时间:2015-06-17 22:13:59

标签: r excel filter dataframe

我想知道是否有人可以帮助对下面的数据进行分组,因为我尝试使用子集函数来过滤低于某个阈值的卷但是假设数据代表对象组,这就产生了问题删除应保留的某些项目。

在F列(和我)中,您可以看到蓝色,红色和黄色物体。每个代表一条DNA链上的三个独立的彩色探针。奇数或非编号的蓝色,红色和黄色与由偶数蓝色,红色和黄色表示的同源链配对。即行2,3和4中的数据是一个"组"并与"组"配对在行5,6和7中显示。然后重复,因此8,9,10是一个新组,该组与11,12,13中的组配对。

我想要做的是对组进行子集,以便只保留那些低于某一距离到中点(M列)的组。这里的中点是连接一个组的蓝色与其伙伴的蓝色的线的中点,因此该子集应该仅适用于蓝色到中点的距离,这就是我遇到问题的地方。例如,如果我要求将蓝色距离保持在小于3的中点,则应保留第3行和第4行中的对象,因为它们是蓝色距离低于3的组的一部分。现在,当我使用子集函数我失去了红色选择和黄色选择。我确信在R中有一个直截了当的解决方案,但是如果有人通过该路线提出建议,我也可以在excel中使用某种类型的过滤。

EDIT  在发布问题后,我昨晚设法在Excel中解决了一些问题。解决方案并不漂亮,但它运作良好。我刚刚在"中间点附近添加了一个新列"这使得一组中的所有对象具有相同的距离,因此当我过滤数据时,我不会丢失任何我不应该丢弃的对象。如果它在将来帮助任何人,我在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)

enter image description here

2 个答案:

答案 0 :(得分:1)

下面提供的基础R解决方案。这个想法是,一旦你的数据在R中,你(编辑)保持!行如果他们符合2个标准。首先,Surpass列必须包含单词" blue"在其中,使用grepl函数完成。其次,距离必须低于某个阈值(由thresh任意设定。

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),]

使用dplyr可能还有一个快速的filter解决方案,但我还没有完全探索那里的功能。另外,如果你还想保留其他颜色,我可能会有点困惑。如果是这样,那就像你想要移除超过特定距离阈值的蓝色那个,你只需执行-which命令,然后将<运算符变为{ {1}}运算符。

答案 1 :(得分:1)

使用可重现的示例会更容易,但这是一个(hacky)plyr解决方案:

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)