как нарезать строки в определенном количестве - PullRequest
1 голос
/ 19 апреля 2019

У меня есть такие данные

df<- structure(list(sname = structure(2:1, .Label = c("sp|P31689|DNJA1_HUMAN DnaJ homolog GN=DNAJA1 PE=1 SV=2", 
"sp|Q9H9K5|MER34_HUMAN Endogenous PE=1 SV=1"), class = "factor"), 
    sence = structure(1:2, .Label = c("MGSSNYATTATVHAVRTSTNSNCWCHDNAVVASASTWWTYSGWMYRVWYAVNHSTSSYRKVTWHWASMAGSAVRAKVGDWRSWGYVVCVYVRVRKSRRSNSNASSAVSTSCVSNRAMKGTTHYDTS", 
    "MVKTTYYDVGVKNATKKAYRKAKYHDKNNGKKSAYVSDAKKRYDKGGAKGGAGGGGSMDDMGGGGRMRRRGKNVVHSVTDYNGATRKAKNVCDKCGRGGKKGAVCCNCRGTGMRHGGMVSVCMCVVDDNRRRHYNGAYDDHHRGGVCTS"
    ), class = "factor")), class = "data.frame", row.names = c(NA, 
-2L))

Я пытаюсь нарезать второй столбец определенным количеством букв, но безуспешно

library("plyr")
laply(seq(1, nchar(df$sence), 2), function(i) substr(df$sence, i, i+1))

В основном я хочу иметь что-то вроде этого, например, разделить его на 10 букв

sp|Q9H9K5|MER34_HUMAN Endogenous PE=1 SV=1  
MGSSNYATTA
TVHAVRTSTN
SNCWCHDNAV
VASASTWWTY
SGWMYRVWYA
VNHSTSSYRK
VTWHWASMAG
SAVRAKVGDW
RSWGYVVCVY
VRVRKSRRSN
SNASSAVSTS
CVSNRAMKGT
THYDTS
sp|P31689|DNJA1_HUMAN DnaJ homolog GN=DNAJA1 PE=1 SV=2  
MVKTTYYDVG
VKNATKKAYR
KAKYHDKNNG
KKSAYVSDAK
KRYDKGGAKG
GAGGGGSMDD
MGGGGRMRRR
GKNVVHSVTD
YNGATRKAKN
VCDKCGRGGK
KGAVCCNCRG
TGMRHGGMVS
VCMCVVDDNR
RRHYNGAYDD
HHRGGVCTS

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Мы можем сделать это с помощью strsplit

setNames(strsplit(as.character(df$sence), "(?<=.{10})", perl = TRUE),
    df$sname)
#$`sp|Q9H9K5|MER34_HUMAN Endogenous PE=1 SV=1`
# [1] "MGSSNYATTA" "TVHAVRTSTN" "SNCWCHDNAV" "VASASTWWTY" "SGWMYRVWYA" "VNHSTSSYRK" "VTWHWASMAG" "SAVRAKVGDW" "RSWGYVVCVY"
#[10] "VRVRKSRRSN" "SNASSAVSTS" "CVSNRAMKGT" "THYDTS"    

#$`sp|P31689|DNJA1_HUMAN DnaJ homolog GN=DNAJA1 PE=1 SV=2`
# [1] "MVKTTYYDVG" "VKNATKKAYR" "KAKYHDKNNG" "KKSAYVSDAK" "KRYDKGGAKG" "GAGGGGSMDD" "MGGGGRMRRR" "GKNVVHSVTD" "YNGATRKAKN"
#[10] "VCDKCGRGGK" "KGAVCCNCRG" "TGMRHGGMVS" "VCMCVVDDNR" "RRHYNGAYDD" "HHRGGVCTS" 

или иметь тот же вывод, что и на выходе ОП

n <- 10
pat <- paste0("(?<=.{", n,"})") 
out <- data.frame(col = unlist(Map(c, as.character(df$sname), 
      strsplit(as.character(df$sence), pat, perl = TRUE))))
row.names(out) <- NULL
head(out)
#                                         col
#1 sp|Q9H9K5|MER34_HUMAN Endogenous PE=1 SV=1
#2                                 MGSSNYATTA
#3                                 TVHAVRTSTN
#4                                 SNCWCHDNAV
#5                                 VASASTWWTY
#6                                 SGWMYRVWYA

Или по той же идеес tidyverse

library(tidyverse)
df %>%
    mutate(sence = str_extract_all(sence, ".{10}")) %>%
    transmute(sence = map2(as.character(sname), sence, c)) %>% 
    unnest
1 голос
/ 19 апреля 2019

Для каждого sence мы можем создать последовательность от 1 до nchar и взять substring

lapply(df$sence, function(x) 
       sapply(seq(1, nchar(x), 10), function(y) substring(x, y, y+9)))


#[[1]]
# [1] "MGSSNYATTA" "TVHAVRTSTN" "SNCWCHDNAV" "VASASTWWTY" "SGWMYRVWYA" "VNHSTSSYRK" 
#     "VTWHWASMAG" "SAVRAKVGDW" "RSWGYVVCVY" "VRVRKSRRSN" "SNASSAVSTS" 
#     "CVSNRAMKGT" "THYDTS"    

#[[2]]
# [1] "MVKTTYYDVG" "VKNATKKAYR" "KAKYHDKNNG" "KKSAYVSDAK" "KRYDKGGAKG" "GAGGGGSMDD" 
#     "MGGGGRMRRR" "GKNVVHSVTD"  "YNGATRKAKN" "VCDKCGRGGK" "KGAVCCNCRG" 
#    "TGMRHGGMVS"   "VCMCVVDDNR" "RRHYNGAYDD" "HHRGGVCTS" 

Чтобы получить вывод в формате OP, мы можем использовать mapply

data.frame(V1 = as.character(unlist(mapply(function(p, q) 
   c(q, sapply(p, function(x) sapply(seq(1, nchar(x), 10), 
   function(y) substring(x, y, y+9)))), df$sence, df$sname))))


#                                                      V1
#1              sp|Q9H9K5|MER34_HUMAN Endogenous PE=1 SV=1
#2                                              MGSSNYATTA
#3                                              TVHAVRTSTN
#4                                              SNCWCHDNAV
#5                                              VASASTWWTY
#6                                              SGWMYRVWYA
#7                                              VNHSTSSYRK
#8                                              VTWHWASMAG
#....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...