2015-06-17 3 views
0

Мне было интересно, может ли кто-нибудь помочь с группировкой данных ниже, поскольку я пытаюсь использовать функцию подмножества для фильтрации томов ниже определенного порога, но учитывая, что данные представляют группы объектов, это создает проблема удаления определенных предметов, которые необходимо сохранить.Фильтрация сгруппированных данных в R

В столбце F (и I) вы можете увидеть синие, красные и желтые объекты. Каждый из них представляет собой три отдельных цветных зонда на одной линии ДНК. Нечетные или не пронумерованные синие, красные и желтые сочетаются с гомологичной нитью, представленной четным синим, красным и желтым. Т.е. данные в строках 2,3 и 4 представляют собой одну «группу» и пару с «группой», показанной в строках 5, 6 и 7. Это повторяется, поэтому 8,9,10 представляют собой новую группу, и эти группы пар с одним в 11,12,13.

То, что я хотел бы сделать, это подмножество групп, чтобы сохранить только те, которые находятся ниже определенного расстояния до средней точки (столбец M). Средняя точка здесь - это средняя точка линии, которая соединяет синий цвет одной группы с синим ее партнером, поэтому подмножество должно применяться только к голубому расстоянию до середины, и именно там у меня проблема. Например, если я попрошу сохранить голубые расстояния до середины, которые меньше 3, то объекты в строках 3 и 4 должны храниться, потому что они являются частью группы с синим расстоянием ниже 3. Сейчас, когда я фильтрую с помощью функция подмножества Я теряю красный выделение и желтый выбор. Я уверен, что в R есть решение для этого, но я также был бы открыт для какой-либо фильтрации в excel, если у кого-то есть предложения по этому маршруту.

EDIT Мне удалось что-то сделать в 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

+1

могли бы вы предоставить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) и показать нам что вы пробовали до сих пор? –

ответ

1

Базовый раствор R ниже. Идея состоит в том, что как только ваши данные находятся в R, вы (отредактируйте) держите! строк, если они отвечают двум критериям. Во-первых, столбец Surpass должен содержать в нем слово «синий», которое выполняется с помощью функции 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, и превратите оператор < в > оператор

+0

'filter (fakeData, Surpass! = 'Blue' | distance> thresh)' - это решение dplyr, которое позволяет хранить большую часть данных во время выброса блюза со слишком большим расстоянием. Но я догадываюсь, что вы что-то пробрали вместе с Excel. Впечатывание этих слов стало чем-то неправильным. –

1

Было бы проще с воспроизводимым примером, но вот (хакерский) 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) 
Смежные вопросы