Я новичок в R и пытаюсь выполнить следующую задачу efficiently
.
У меня есть data.frame
, x
со столбцами: start
, end
, val1
, val2
, val3
, val4
.Столбцы отсортированы / упорядочены по start
.
Для каждого start
сначала я должен найти все записи в x
, которые имеют одинаковые start
.Поскольку список упорядочен, они будут последовательными.Если конкретный start
встречается только один раз, то я игнорирую его.Затем для этих записей, которые имеют одинаковые start
, скажем, для одной конкретной start
, есть 3 записи, как показано ниже:
записей для start=10
start end val1 val2 val3 val4
10 25 8 9 0 0
10 55 15 200 4 9
10 30 4 8 0 1
Затем я должен взять 2 строки за раз и выполнить fisher.test
на 2x4
матрицах val1:4
.То есть
row1:row2 => fisher.test(matrix(c(8,15,9,200,0,4,0,9), nrow=2))
row1:row3 => fisher.test(matrix(c(8,4,9,8,0,0,0,1), nrow=2))
row2:row3 => fisher.test(matrix(c(15,4,200,8,4,0,9,1), nrow=2))
Код, который я написал, выполняется с использованием for-loops
, традиционно.Мне было интересно, может ли это быть векторизация или улучшена в любом случае.
f_start = as.factor(x$start) #convert start to factor to get count
tab_f_start = as.table(f_start) # convert to table to access count
o_start1 = NULL
o_end1 = NULL
o_start2 = NULL
o_end2 = NULL
p_val = NULL
for (i in 1:length(tab_f_start)) {
<b># check if there are more than 1 entries with same start</b>
if ( tab_f_start[i] > 1) {
<b># get all rows for current start</b>
cur_entry = x[x$start == as.integer(names(tab_f_start[i])),]
<b># loop over all combinations to obtain p-values</b>
ctr = tab_f_start[i]
for (j in 1:(ctr-1)) {
for (k in (j+1):ctr) {
<b># store start and end values separately</b>
o_start1 = c(o_start1, x$start[j])
o_end1 = c(o_end1, x$end[j])
o_start2 = c(o_start2, x$start[k])
o_end2 = c(o_end2, x$end[k])
<b># construct matrix</b>
m1 = c(x$val1[j], x$val1[k])
m2 = c(x$val2[j], x$val2[k])
m3 = c(x$val3[j], x$val3[k])
m4 = c(x$val4[j], x$val4[k])
m = matrix(c(m1,m2,m3,m4), nrow=2)
p_val = c(p_val, fisher.test(m))
}
}
}
}
result=data.frame(o_start1, o_end1, o_start2, o_end2, p_val)
Спасибо!