Существует несколько способов решения проблемы.
Первый, более простой (с точки зрения программирования) вариант заключается в том, что если вы можете разбить строку на несколько столбцов фрейма данных, то вы можно использовать простые инструменты из dplyr
, чтобы превратить фрейм данных в длинный формат, а затем поменять местами индексы:
library(tidyverse)
# Generate data
set.seed(123456)
sequence_tibble1 <- tibble(c1 = sample(letters, 10), c2 = sample(letters, 10),
c3 = sample(letters, 10), c4 = sample(letters, 10),
c5 = sample(letters, 10), c6 = sample(letters, 10),
c7 = sample(letters, 10), c8 = sample(letters, 10))
# Turn data frame long & turn the position variable numeric
sequence_tibble1 <- sequence_tibble1 %>%
gather(key = 'position', value = 'character') %>%
mutate(position = str_remove(position, 'c') %>% as.numeric())
# Create updated position2 variable that has the new positions you want
sequence_tibble1 <- sequence_tibble1 %>%
mutate(position2 = case_when(
position == 2 ~ 8,
position == 8 ~ 2,
TRUE ~ position
))
Второй вариант может немного больше походить на то, что вам нужно, но он полагается на Немного о более продвинутом функциональном программировании с purrr
, однако должно быть довольно очевидно, что происходит:
sequence <- list(c(sample(letters, 10)), c(sample(letters, 10)),
c(sample(letters, 10)), c(sample(letters, 10)))
sequence_tibble2 <- tibble(sequence)
swap_positions <- function(x) {
x <- c(x[1:5], x[10], x[7:9], x[6])
}
sequence_tibble2 <- sequence_tibble2 %>%
mutate(sequence2 = purrr::map(sequence, ~ swap_positions(.x)))