选择数据框中的连续行... r

时间:2016-10-05 09:47:15

标签: r dataframe

我需要在数据框中执行一些操作,因为有点特别,我不知道如何执行它们。以下是一些数据:

x<-seq(1:250)
pos<-seq(1000,1249,1)
pval<-c(rep(0.25,40),rep(0.0001,10),rep(0.14,100),rep(0.0005,20),rep(0.58,10),rep(0.00001,20),rep(0.85,50))
len<-rep(0.1,250)
nsnp<-rep(33.7,250)
data<-data.frame(cbind(x,pos,pval,len,nsnp))

好吧,我的问题是我需要从这个创建一个数据框,但我需要根据数据$ pval组合连续的行。也就是说,按数据$ x排序我需要连接所有具有数据$ pval&lt; = 0.05的连续元素。并执行:

  1. 数据$ pval&lt; = than 0.05
  2. 的第一个和最后一个连续元素之间的数据$ pos的平均值
  3. 使用数据$ pval&lt; = than 0.05
  4. 对所有连续数据$ len求和
  5. 使用数据$ pval&lt; = than 0.05
  6. 对所有连续数据$ nsnp求和

    由于在我们的数据框(数据)中有3个连续数据为$ x的区域,因此最终数据库应如下所示:

           pos len nsnp
    [1,] 1044.5   1  337
    [2,] 1159.5   2  674
    [3,] 1189.5   2  674
    

    这个数字可以这样获得:

    data2<-subset(data,data$pval<=0.05)
    mean(data2$pos[data2$pos>=1040 & data2$pos<=1049])
    sum(data2$len[data2$pos>=1040 & data2$pos<=1049])
    sum(data2$nsnp[data2$pos>=1040 & data2$pos<=1049])
    mean(data2$pos[data2$pos>=1150 & data2$pos<=1169])
    sum(data2$len[data2$pos>=1150 & data2$pos<=1169])
    sum(data2$nsnp[data2$pos>=1150 & data2$pos<=1169])
    mean(data2$pos[data2$pos>=1180 & data2$pos<=1199])
    sum(data2$len[data2$pos>=1180 & data2$pos<=1199])
    sum(data2$nsnp[data2$pos>=1180 & data2$pos<=1199])
    

    我希望现在我的问题得到了解。我的问题是我找不到如何根据数据$ x选择连续的行。我的例子中的这些连续行是:pos 1040-1049,pos 1150-1169和pos 1180-1199。

2 个答案:

答案 0 :(得分:2)

似乎可以通过pval进行分组来完成,因此使用dplyr

library(dplyr)
data2 %>% 
  group_by(pval) %>% 
  summarise(pos = mean(pos), len = sum(len), nsnp = sum(nsnp))
# A tibble: 3 × 4
#   pval    pos   len  nsnp
#  <dbl>  <dbl> <dbl> <dbl>
#1 1e-05 1189.5     2   674
#2 1e-04 1044.5     1   337
#3 5e-04 1159.5     2   674

但是,如果情况并非如此,那么我们可以按以下方式按连续pos值进行分组,

library(dplyr)
data2 %>% 
  group_by(new = cumsum(c(1, diff(pos) != 1))) %>% 
  summarise(pos = mean(pos), len = sum(len), nsnp = sum(nsnp))
# A tibble: 3 × 4
#    new    pos   len  nsnp
#  <dbl>  <dbl> <dbl> <dbl>
#1     1 1044.5     1   337
#2     2 1159.5     2   674
#3     3 1189.5     2   674

答案 1 :(得分:0)

您可以将数据框d子集化为:

d[d$variable <= 0.05,]

Google R refcard,用于分组数据框的方法。阅读基本的R指南以完成其余的工作。

祝你好运