как я могу написать функцию цикла в R, чтобы повторить эти коды для каждой строки

#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]