Cześć mam df takie jak

scaffolds start end 
scaf1.1_0 1     40
scaf1.1_2 41    78
scaf1.1_3 79    300 
seq_1f2.1 1     30
seq_1f3.1 1     90
seq_1f2.3 91    200

I chciałbym zrobić DF $ End-1 tylko dla zdupitowanego elementu DF $ rusztowania (osoby z _NB).

Tutaj powinienem uzyskać wyjście:

scaffolds start end 
scaf1.1_0 1     40
scaf1.1_2 41    78
scaf1.1_3 79    299 
seq_1f2.1 1     30
seq_1f3.1 1     90
seq_1f2.3 91    199

Gdzie 300-1 = 299, ponieważ scaf1.1_3 był ostatnim i 200-1 = 199, ponieważ seq_1f2.3 był ostatnim

Jak widać seq_1f2.1 nie zmienił się, ponieważ nie miał żadnych _value

0
chippycentra 7 październik 2020, 19:42

1 odpowiedź

Najlepsza odpowiedź

Może to to, czego szukasz? Utwórz zmienne grupujące na podstawie ciągów i wyodrębnij ostatnią wartość na grupę, aby obliczyć różnicę:

library(tidyverse)
#Code
df %>% mutate(Var1=substr(scaffolds,1,3),
              Var2=as.numeric(substr(scaffolds,nchar(scaffolds),nchar(scaffolds)))) %>%
  group_by(Var1) %>%
  mutate(end=ifelse(Var2==max(Var2),end-1,end)) %>% ungroup() %>%
  select(-c(Var1,Var2))

Wynik:

# A tibble: 6 x 3
  scaffolds start   end
  <chr>     <int> <dbl>
1 scaf1.1_0     1    40
2 scaf1.1_2    41    78
3 scaf1.1_3    79   299
4 seq_1f2.1     1    30
5 seq_1f3.1     1    90
6 seq_1f2.3    91   199

Niektóre wykorzystane dane:

#Data
df <- structure(list(scaffolds = c("scaf1.1_0", "scaf1.1_2", "scaf1.1_3", 
"seq_1f2.1", "seq_1f3.1", "seq_1f2.3"), start = c(1L, 41L, 79L, 
1L, 1L, 91L), end = c(40L, 78L, 300L, 30L, 90L, 200L)), class = "data.frame", row.names = c(NA, 
-6L))
1
Duck 7 październik 2020, 16:49