2016-09-19 2 views
5

Я полагаю, что я новичок в R, и на самом деле я пытаюсь получить основные принципы. В настоящее время я работаю над большим фреймворком данных (называемым «ppl»), который мне нужно отредактировать, чтобы отфильтровать некоторые строки. Каждая строка входит в группу и характеризуется значением интенсивности (в) и значением выборки.R Для петли не работает максимальная функция

 mz rt  into sample tracker  sn grp 
100.0153 126 2.762664  3 11908 7.522655 0 
100.0171 127 2.972048  2 5308 7.718521 0 
100.0788 272 30.217969  2 5309 19.024807 1 
100.0796 272 17.277916  3 11910 7.297716 1 
101.0042 128 37.557324  3 11916 27.991320 2 
101.0043 128 39.676014  2 5316 28.234918 2 

Ну, первый вопрос: «Как я могу выбрать из каждой группы образец с наивысшей интенсивностью?» Я попробовал цикл:

for (i in ppl$grp) { 
temp<-ppl[ppl$grp == i,] 
sel<-rbind(sel,temp[max(temp$into),]) 
} 

Дело в том, что он работает на госзакупках $ GRP == 0, но следующие циклы возврата Nas строк. Затем отфильтрованный блок данных (называемый «sel») также должен хранить образцы значений удаленных строк. Оно должно быть следующим:

 mz rt  into sample tracker  sn grp 
100.0171 127 2.972048 c(2,3) 5308 7.718521 0 
100.0788 272 30.217969 c(2,3) 5309 19.024807 1 
101.0043 128 39.676014 c(2,3) 5316 28.234918 2 

Для того, чтобы получить это, я хотел бы использовать этот подход:

lev<-factor(ppl$grp) 
samp<-ppl$sample 
samp2<-split(samp,lev) 
sel$sample<-samp2 

Любой намек? Потому что я не могу проверить это, так как я до сих пор не решил предыдущую проблему.

Большое спасибо.

ответ

1

base R вариант с использованием ave является

ppl[with(ppl, ave(into, grp, FUN = max)==into),] 

Если столбец 'образец' в ожидаемом выходе имеют unique элементы в каждом 'grp', затем после группировки 'grp', вверх введите «образец» в качестве paste d unique элементов «образца», затем arrange «в» по ​​убыванию и slice 1-й ряд.

library(dplyr) 
ppl %>% 
    group_by(grp) %>% 
    mutate(sample = toString(sort(unique(sample)))) %>% 
    arrange(desc(into)) %>% 
    slice(1L) 
#  mz rt  into sample tracker  sn grp 
#  <dbl> <int>  <dbl> <chr> <int>  <dbl> <int> 
#1 100.0171 127 2.972048 2, 3 5308 7.718521  0 
#2 100.0788 272 30.217969 2, 3 5309 19.024807  1 
#3 101.0043 128 39.676014 2, 3 5316 28.234918  2 
2

Не уверен, что я следую вашему вопросу. Но, возможно, это поможет вам начать.

library(dplyr) 
ppl %>% group_by(grp) %>% filter(into == max(into)) 
0

data.table альтернатива:

library(data.table) 
setkey(setDT(ppl),grp) 
ppl <- ppl[ppl[,into==max(into),by=grp]$V1,] 
##   mz rt  into sample tracker  sn grp 
##1: 100.0171 127 2.972048  2 5308 7.718521 0 
##2: 100.0788 272 30.217969  2 5309 19.024807 1 
##3: 101.0043 128 39.676014  2 5316 28.234918 2 
0

Я понятия не имею, почему этот код будет работать

for (i in ppl$grp) { 
    temp<-ppl[ppl$grp == i,] 
    sel<-rbind(sel,temp[max(temp$into),]) 
} 

макс (Темп $ в) должна возвращать максимальное значение - который, кажется, не быть целым числом в большинстве случаев.

Кроме того, создание data.frame с rbind в каждом экземпляре цикла не является хорошей практикой (на любом языке). Это требует прекращения проверки типов и роста массивов, которые могут стать очень дорогими.

Кроме того, max вернет NA, если для этой группы есть какие-либо NA.

Существует также вопрос о том, что вы хотите сделать для связей? Вам просто нужен один результат или все? Код Akrun дает вам все.

Этот код будет написать новый столбец, который имеет группу макс

ppl$grpmax <- ave(ppl$into, ppl$grp, FUN=function(x) { max(x, na.rm=TRUE) }) 

Вы можете выбрать все значения в группе, равные по максимуму с

pplmax <- subset(ppl, into == grpmax) 

Если вы хотите просто по одной на группу, то вы можете удалить дубликаты

pplmax[!duplicated(pplmax$grp),] 
Смежные вопросы