Нахождение 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