Написание функции для анализа подмножества в кадре данных - PullRequest
1 голос
/ 11 апреля 2011

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

В частности, соответствующие частимоего кадра данных, allmutations, выглядят так:

gennumber   sel  

1          -0.00351647088810292  
1           0.000728499401888683  
1           0.0354633950503043  
1           0.000209700229276244  
2           6.42307549736376e-05  
2          -0.0497259605114181  
2          -0.000371856995145525  

В каждом поколении (gennumber) я хотел бы подсчитать долю значений в «sel», которые больше 0,001, между -0,001 и0,001 и менее -0,001.На протяжении всего набора данных я только что делал это:

ben <- allmutations$sel > 0.001      #this is for all generations                
bencount <- length(which(ben==TRUE)) 
totalmu <- length(ben) #             #length(ben) = total # of mutants
tot.pben <- bencount/totalmu         #proportion

Каков наилучший способ выполнить эту операцию для каждого значения в gennumber?Кроме того, есть ли простой способ получить пропорцию значений в диапазоне -0,001

Спасибо за любую помощь, которую вы можете оказать, и, пожалуйста, дайте мне знать, если я могу дать какие-либо разъяснения.

dput()данных:

structure(list(gennumber = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), sel = c(-0.00351647088810292, 
0.000728499401888683, 0.0354633950503043, 0.000209700229276244, 
6.42307549736376e-05, -0.0497259605114181, -0.000371856995145525
)), .Names = c("gennumber", "sel"), class = "data.frame", row.names = c(NA, 
-7L))

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Для первой части, предполагая, что ваши данные находятся в dat, мы сначала разбиваем данные на gennumber:

sdat <- with(dat, split(dat, gennumber))

, затем мы пишем пользовательскую функцию, чтобы выполнить сравнение, которое вы хотите

foo <- function(x, cutoff = 0.001) {
    sum(x[,2] > cutoff) / length(x[,2])
}

и sapply() это по отдельным фрагментам данных в sdat

sapply(sdat, foo)

Что дает:

> sapply(sdat, foo)
   1    2 
0.25 0.00

для этой выборки данных.

Для второй части мы можем расширить вышеуказанную функцию foo(), чтобы принять верхний и нижний пределы и выполнить вычисление:

bar <- function(x, upr, lwr) {
    sum(lwr < x[,2] & x[,2] < upr) / length(x[,2])
}

Что дает, [показывая, как пройти вдополнительные аргументы]

> sapply(sdat, bar, lwr = -0.001, upr = 0.001)
        1         2 
0.5000000 0.6666667
0 голосов
/ 11 апреля 2011

Вы можете объединить два логических теста с &, поэтому для проверки -0,001 sel > -0.001 & sel < 0.001

Вот способ использования plyr:

dat <- read.table(tc <- textConnection("
gennumber sel
1 -0.00351647088810292
1 0.000728499401888683
1 0.0354633950503043
1 0.000209700229276244
2 6.42307549736376e-05
2 -0.0497259605114181
2 -0.000371856995145525"), header = TRUE); close(tc)

library("plyr")

ddply(dat,.(gennumber),summarize,
    `sel < -0.001` = sum(sel < -0.001)/length(sel),
    `-0.001 < sel < 0.001` = sum(sel > -0.001 & sel < 0.001)/length(sel),
    `0.001 < sel` = sum(sel > 0.001)/length(sel))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...