2016-10-05 2 views
0

Мне нужно выполнить некоторые операции в фрейме данных, и, поскольку они немного конкретны, я не знаю, как их выполнять. Вот некоторые данные:Выбор последовательных строк в кадре данных ... r

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

Ну, так что моя проблема в том, что мне нужно создать фрейм данных из этого, но мне нужно, чтобы объединить последовательные строки в соответствии с данными $ ПВС. То есть сортировка по данным $ x Мне нужно объединить все последовательные элементы, которые имеют данные $ pval < = чем 0,05. И выполнить:

  1. Среднее значение данных $ поз между первым и последним подряд элемент с данными $ ПВС < = 0,05
  2. Сумма всех последовательных данных $ Len с данными $ ПВС < = 0,05
  3. Сложите все подряд данные $ nsnp с данными $ ПВС < = 0,05

Поскольку в нашем кадре данных (данных) есть 3 области с последовательными данными $ чисел х, окончательная база данных должна выглядеть следующим образом:

 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.

+0

Hi Cebs. Что вы пробовали? – Vincent

+0

Для первой части я подмножество в соответствии с данными $ pval. Однако я не знаю, как начать получать операции последовательных строк. Спасибо – Cebs

+0

Опять же, я не понимаю, почему мой вопрос является нисходящим ... Является идеальным законным вопросом, с примером и, я считаю, хорошо объяснил, пожалуйста, объясните мне, почему ... – Cebs

ответ

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 
0

Вы можете Подмножество dataframe д а так:

d[d$variable <= 0.05,] 

Google R refcard пути Подменят кадры данных. Прочтите базовое руководство R для достижения остальных.

Успехов

+0

Да, я знаю, что могу подмножество. Но мой вопрос заключается не в подмножестве, а в том, как получить нужные мне операции последовательными строками. – Cebs

Смежные вопросы