【问题标题】:Filtering grouped data in R在 R 中过滤分组数据
【发布时间】:2015-06-17 22:13:58
【问题描述】:

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

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

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

编辑 昨晚发布问题后,我设法在 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)

【问题讨论】:

标签: r excel filter dataframe


【解决方案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)

【讨论】:

    【解决方案2】:

    下面提供的基础 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),]
    

    可能还有一个使用filter 的快速dplyr 解决方案,但我还没有完全探索那里的功能。另外,如果您还想保留其他颜色,我可能会有些困惑。如果是这样,这与说您要删除超过一定距离阈值的蓝色是一样的,您只需执行-which 命令,然后将&lt; 运算符转换为&gt; 运算符。

    【讨论】:

    • filter(fakeData, Surpass != 'blue' | distance &gt; thresh) 是 dplyr 解决方案,可以保留大部分数据,同时丢弃距离过大的蓝调。但我猜你用 Excel 拼凑了一些东西。输入这些词感觉有点不对劲。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    相关资源
    最近更新 更多