Я не уверен, что это самый простой способ сделать это, но он должен работать.
Прежде всего, попробуйте опубликовать свои данные, используя dput(yourdata)
. Тогда людям будет проще работать с вашим конкретным c примером.
Я предполагаю, что каждая строка состоит из одного "образца", поэтому задача состоит в том, чтобы сначала добавить идентификатор образца, а затем поместить его в длинный отформатируйте и затем вернитесь к широкоформатному формату.
Данные:
a <- data.frame(Pos = c("CIPOS=0",
"SCORE=89",
"CIPOS=9",
"CIPOS=8",
"STRAND=+"),
Score = c("SCORE=1",
"STRAND=-",
"SCORE=1",
"SCORE=1",
"LEN=555"),
Strand = c("STRAND=+",
"LEN=567",
"STRAND=+",
"STRAND=+",
"UTR=+")
)
dput(a)
#> structure(list(Pos = structure(c(1L, 4L, 3L, 2L, 5L), .Label = c("CIPOS=0",
#> "CIPOS=8", "CIPOS=9", "SCORE=89", "STRAND=+"), class = "factor"),
#> Score = structure(c(2L, 3L, 2L, 2L, 1L), .Label = c("LEN=555",
#> "SCORE=1", "STRAND=-"), class = "factor"), Strand = structure(c(2L,
#> 1L, 2L, 2L, 3L), .Label = c("LEN=567", "STRAND=+", "UTR=+"
#> ), class = "factor")), class = "data.frame", row.names = c(NA,
#> -5L))
А затем, если вы запустите этот код:
library(tidyverse)
a %>% mutate(sample = row_number()) %>%
pivot_longer(-sample) %>%
# here you have to unselect the name column, since this is actually wrong
select(-name) %>%
# separate the strings that contain the data
separate(value, into = c("group", "value"), sep = "=") %>%
# put it back to wide format
pivot_wider( names_from = group,
values_from = value)
#> # A tibble: 5 x 6
#> sample CIPOS SCORE STRAND LEN UTR
#> <int> <chr> <chr> <chr> <chr> <chr>
#> 1 1 0 1 + <NA> <NA>
#> 2 2 <NA> 89 - 567 <NA>
#> 3 3 9 1 + <NA> <NA>
#> 4 4 8 1 + <NA> <NA>
#> 5 5 <NA> <NA> + 555 +
Создано в 2020 г. -03-04 * Представить пакет (v0.3.0)