2013-06-14 2 views
0

Я пытаюсь подсчитать записи, попадающие в окно 1000, проблема в том, что я использую для циклов, которые делают количество операций, которые необходимо выполнить достаточно большими (I ' m довольно новичок в R), и я получаю ошибку за пределами границ. Я знаю, что должен быть лучший способ сделать это.R-индекс за пределами с циклами

File (предупреждение файл является чуть более 100mb): bamDF.txt

Использование:

dget(file="bamDF.txt") 

Сценарий:

attach(bamDF) 
out <- matrix(0,1,ceiling((max(pos, na.rm=TRUE)-min(pos, na.rm=TRUE))/interval)) 
interval <- 1000 
for(q in 1:nrow(bamDF)){ 
    for(z in 1:ceiling((max(pos, na.rm=TRUE)-min(pos, na.rm=TRUE))/interval)){ 
    if(min(pos, na.rm=TRUE)+interval*(z-1)<pos[q]&&pos[q]<(min(pos, na.rm=TRUE)+interval*(z))){ 
     out[z,] <- out[z,]+1; 


    } 

    } 


} 
detach(bamDF) 
+0

Что именно вы подразумеваете под словом "fall in the 1000 window"? – nico

+0

Представьте, что у вас есть номер строки от 1 до 5000, поэтому для окна 1000/bin у вас будет 5 бункеров в этом интервале, тогда вы будете смотреть на все числа, которые попадают в каждый бит и подсчитывают их. Надеюсь, что это немного разъяснит. – crysis405

+0

Есть ли таблица (cut (yourdatatocount, seq (0, 5000, 1000))) 'что-то близкое к тому, что вы ищете? – Justin

ответ

1

Вы можете использовать функцию cut

# set the seed to get a reproducible example 
set.seed(12345) 

min.val <- 0 
max.val <- 5000 
num.val <- 10000 
# Generate some random values 
values <- sample(min.val:max.val, num.val, replace=T) 

interval <- 1000 
num.split <- ceiling((max.val - min.val)/interval)+1 

# Use cut to split the data. 
# You can set labels=FALSE if you want the group number 
# rather than the interval 
groups <- cut(values, seq(min.val, max.val, length.out=num.split)) 

# Count the elements in each group 
res <- table(groups) 

res будет содержать:

groups 
    (0,1e+03] (1e+03,2e+03] (2e+03,3e+03] (3e+03,4e+03] (4e+03,5e+03] 
     1987   1974   2054   2000   1984 

Кроме того, вы можете просто использовать hist функцию:

h <- hist(values, 10) # 10 bins 

или

h <- hist(values, seq(min.val, max.val, length.out=num.split)) 

h$counts содержит счетчики. Используйте plot=NULL, если вы не хотите отображать результаты.

+0

Интересно, что это то, что я получил (быстрый вопрос, который вызывает у меня немного беспокойства, будет перекрытие между сокращениями, т. Е. Последнее значение <или = <): 'groups (1144,2144) (2144,3143.99) (3143.99, 4143.99] 1 6 4 ' – crysis405

+1

@ crysis405: выполняется правильное значение, левое - нет (' 'и' '' - стандартная математическая нотация для этого). Вы можете изменить поведение, используя параметр 'right' Результаты выглядят странно: у вас есть только 11 значений? – nico

+0

no Я получил 249239 значений, которые правы, но почему он не начинается с 0, как у вас, и почему существуют десятичные числа? – crysis405

0
grps <- seq(min(pos), max(pos), by= 1000) 
counts <- table(findInterval(pos, c(grps, Inf))) 
names(counts) <- grps 
Смежные вопросы