Нахождение IQR групп строк

Я хочу найти IQR диапазона значений в кадре данных. Эти значения также сгруппированы, поэтому мне нужно найти IQR каждой группы в кадре данных. У меня есть следующая таблица:

 Block DNAname  Spot_Size   Molarity    Cy3_Fluorescence
 1  DNA 01  100pl   100 14266
 1  DNA 01  100pl   100 16020
 1  DNA 01  100pl   100 15705
 1  DNA 01  100pl   100 15783
 1  DNA 01  100pl   100 15834
 1  DNA 01  100pl   50  12248
 1  DNA 01  100pl   50  12209
 1  DNA 01  100pl   50  12511
 1  DNA 01  100pl   50  12316
 1  DNA 01  100pl   50  12469
 1  DNA 01  100pl   25  9626
 1  DNA 01  100pl   25  9804
 1  DNA 01  100pl   25  9794
 1  DNA 01  100pl   25  10020
 1  DNA 01  100pl   25  9739
 1  DNA 01  100pl   10  7158
 1  DNA 01  100pl   10  6802
 1  DNA 01  100pl   10  7378
 1   DNA 01 100pl   10  5949
 1  DNA 01  100pl   10  7484
 1  DNA 01  100pl   5   5257
 1  DNA 01  100pl   5   5560
 1  DNA 01  100pl   5   6076
 1  DNA 01  100pl   5   5925

Я запускаю следующий код, чтобы найти IQR:

aggregate(Cy3.DNA1.100pl.1uM$Cy3_Fluorescence, list(Molarity=
    Cy3.DNA1.100pl.1uM$Molarity, Spot_Size=Cy3.DNA1.100pl.1uM$Spot_Size ), IQR)

Это дает мне выход:

   Molarity  Spot_Size   x
      5     100pl    384
     10     100pl    576
     25     100pl     65
     50     100pl    221
    100     100pl    129

Этот вывод корректно группирует все молярности, но IQR неверен. Если приведенный выше код имеет среднее значение как функцию вместо IQR, значение для x (значение функции) является правильным, как показано ниже:

   Molarity Spot_Size       x
    5     100pl       5752.4
   10     100pl       6954.2
   25     100pl       9796.6
   50     100pl      12350.6
  100     100pl      15521.6

Ожидаемый IQRS должен быть следующим:

Molarity IQR
100      324.25
50       258
25       363
10       519.5
5        400

Любая помощь приветствуется. Если у кого-то есть какие-либо идеи, как я мог бы выполнить эту функцию для IQR, когда есть группы размеров пятна (где размер пятна колеблется от 100 до 400 фунтов), включая категории молярности, я бы хотел их услышать.

Спасибо, пожалуйста, ТАК.

2 ответа

Решение

Не ясно, связана ли ваша проблема с агрегацией или с вашим (??) определением IQR. Есть много способов рассчитать IQR (см. Это и это). Насколько я могу судить, ни один из них не даст результатов в вашем посте.

Что касается агрегации, основанной на размере пятна и молярности, здесь есть два пути:

# use aggregate(...) in base R - will be slow with large datasets
aggregate(Cy3_Fluorescence~Molarity+Spot_Size,df,IQR)
#   Molarity Spot_Size Cy3_Fluorescence
# 1        5     100pl            478.5
# 2       10     100pl            576.0
# 3       25     100pl             65.0
# 4       50     100pl            221.0
# 5      100     100pl            129.0

# use data.table - will be extremely fast.
library(data.table)
setDT(df)[,list(IQR=IQR(Cy3_Fluorescence)),by=list(Molarity,Spot_Size)]
#    Molarity Spot_Size   IQR
# 1:      100     100pl 129.0
# 2:       50     100pl 221.0
# 3:       25     100pl  65.0
# 4:       10     100pl 576.0
# 5:        5     100pl 478.5

Я знаю, что это старый пост, но сегодня у меня была эта проблема, и ее было легче решить:

      library(tidyverse)
#get IQR
a <- df %>% group_by(Spot_Size) %>% group_by(Molarity) %>% summarise(IQR(Cy3_Fluorescence))
a <- data.frame(a)
a
#  Molarity IQR.Cy3_Fluorescence.
#        5                 478.5
#       10                 576.0
#       25                  65.0
#       50                 221.0
#      100                 129.0
Другие вопросы по тегам