#r #loops
#r #циклы
Вопрос:
#gg — это мой фрейм данных, поскольку он содержит 1000 разных seqname
seqname start end
scaffold02439 843 1180
scaffold02439 928 1180
scaffold02439 3560 3672
scaffold02439 3560 3672
scaffold02439 5525 5666
scaffold02439 5525 5666
#Я хочу взять начальное и конечное значение каждого seqname
c <- unique(gg$seqname)
l1 <- gg %>% filter(seqname %in% c[1] )
l1a <- l1[1,2]
l1b <- l1[nrow(l1),3]
l1 <- cbind(c[1],l1a,l1b)
l2 <- gg %>% filter(seqname %in% c[2])
l2a <- l2[1,2]
l2b <- l2[nrow(l2),3]
l2 <- cbind(c[2],l2a,l2b)
Как я могу записать это в форме цикла, чтобы извлечь каждое значение, а затем взять начало (2-й столбец) первой строки и конец (третий столбец) последней строки этих данных
Ответ №1:
Вы могли бы сделать что-то вроде этого
library(dplyr)
gg %>% group_by(seqname) %>% #group by seqname
summarise(start = first(start), end = last(end))#extract first and last
Это вернет первую и последнюю записи, которые не обязательно являются минимальными и максимальными значениями start
и end
. Если вы хотите этого вместо этого, просто используйте summarise(start = min(start), end = max(end))
.
Комментарии:
1. спасибо за ваш ответ; однако я получил эту ошибку Ошибка: проблема с
summarise()
вводомstart
. x невозможно найти унаследованный метод для функции ‘first’ для подписи ‘»integer»’ ℹ Вводstart
first(ref)
. ℹ Ошибка произошла в группе 1: seqname = «scaffold00001». Запуститеrlang::last_error()
, чтобы увидеть, где произошла ошибка.2. Что вы получите, если запустите
str(gg)
?3. ‘data.frame’: 1048576 obs. из 3 переменных: $ seqname: chr «scaffold02439» «scaffold02439» «scaffold02439» «scaffold02439» «scaffold02439» «scaffold02439» «scaffold02439» … $ start : int 843 928 3560 3560 5525 5525 5743 5743 3297 3297 … $ end : int 1180 1180 3672 3672 5666 5666 5909 5909 3506 3506 …
4. Я не уверен, почему вы получили ошибку, хотя я думаю, что неправильно понял, о чем вы спрашивали, поэтому обновил ответ выше.
Ответ №2:
Мы также можем использовать data.table
library(data.table)
setDT(gg)[, .(start = first(start), end = last(end)), seqname]