Перемещение 10-го символа в строке к 4-му от конца в пределах кадра данных в R - PullRequest
0 голосов
/ 30 января 2020

У меня есть строки внутри фрейма данных (класс chr), но для простоты я просто опишу 1 строку.

x <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N")

Я хочу переупорядочить несколько этих строк (в столбце seq ) таким же образом, перемещая 10-й символ («J») в его новую позицию 4-й от конца (где сейчас «K»), поэтому в этом случае он просто меняет местами «J» и «K». Я предполагаю, что это выглядело бы примерно как

mutate(seq_reordered = str_replace("pattern", "replacement", seq) %>%

или, может быть,

mutate(seq_reordered = sub(seq, "pattern", "replacement") %>%

, но условия регулярных выражений смущают меня, и для меня не очевидно, как это работает

Ответы [ 4 ]

1 голос
/ 30 января 2020

Определите перестановку ix, а затем примените ее:

ix <- replace(seq_along(x), c(10, 11), c(11, 10))
x[ix]
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "K" "J" "L" "M" "N"

Вышесказанное особенно удобно, если у вас есть фрейм данных, и вам нужно применить его ко всем или некоторым строкам, поскольку он может все сделать сразу.

DF <- DF[ix, ]

или применить его только к столбцам jy:

DF[jy] <- DF[ix, jy]

Хотя это не так удобно для массового применения, другой подход заключается в использовании replace непосредственно на x:

replace(x, c(10, 11), x[c(11, 10)])
1 голос
/ 30 января 2020

Поскольку это vector длины 14, мы можем переставить индексирование

x1 <- c(x[1:9], x[11], x[10], x[12:length(x)])

или просто выполнить индексацию

x1 <- x[c(1:9, 11:10, 12:length(x))]
0 голосов
/ 30 января 2020

Существует несколько способов решения проблемы.

Первый, более простой (с точки зрения программирования) вариант заключается в том, что если вы можете разбить строку на несколько столбцов фрейма данных, то вы можно использовать простые инструменты из 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)))

0 голосов
/ 30 января 2020

Classi c проблема обмена?

temp <- x[10]
x[10] <- x[length(x) - 3] 
x[length(x) - 3] <- temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...