Чтобы узнать, какая часть data.frame удовлетворяет некоторому условию, вы можете использовать which
, чтобы получить все индексы, для которых это условие равно TRUE
, так что вы можете использовать его для получения частей, которые выВы заинтересованы.
Если мы предположим, что у вас есть data.frame с именем df1
для первой части вашего вопроса, а второе изображение с именем df2
, то вы можете получить индексный диапазонстрок в df1 с 'chr1', например так:
range <- which(df1$chr=='chr1')[df2$start[1]]:which(df1$chr=='chr1')[df2$end[1]]
или вместо того, чтобы вручную вводить 'chr1', вы можете использовать df2$chr[1]
.
Для подсчета sum(df1[range, 'coverage'] > 0)
говорит вам, какмногие значения больше нуля.
Теперь нам нужно сделать это для всех строк вместе, мы можем использовать sapply, чтобы сделать что-то для всех предоставленных значений:
df2$mapped <- sapply(1:nrow(df2), function(row) {
range <- which(df1$chr==df2$chr[row])[df2$start[row]]:which(df1$chr==df2$chr[row])[df2$end[row]]
sum(df1[range, 'coverage'] > 0)
}
Другие ваши вопросы прощеответил, затем спросил, как в R большинство функций векторизовано: вы можете сделать что-то для нескольких значений одновременно.
df2$size = (df2$end - df2$start)+1
df2$perc_mapped = (df2$mapped/df2$size)*100
Полнота - это всего лишь сумма всех строк вместе, sum(df2$size)
и sum(df2$mapped)