Реализация LIFO в преобразовании значений строк, разделенных запятыми, в значения отдельных строк - PullRequest
0 голосов
/ 29 июня 2018

У меня есть data frame, где отдельные значения строк разделены запятыми, я хотел разделить значения запятых на отдельные значения строк. Таким образом, используя этот SO пост был в состоянии достичь при преобразовании разделенных запятыми строковых значений в отдельных строках, но он заменяет первое значение, если строка, в качестве первых значений, если строка и я хотели получить обратное значение это, то есть First string value is the last row value.

# create data 
library(tidyverse)
d <- data_frame(
  col1 = c("1,2,3")
)

Dataframe

    # # A tibble: 3 x 2
#              col1
#              <chr>
# 1            1,2,3


# tidy data
separate_rows(d, col1, convert = TRUE)

Current Output

# # A tibble: 6 x 2
#     col1
#    <int>
#      1
#      2
#      3

Desired Output

# tidy data
separate_rows(d, col1, convert = TRUE)
# # A tibble: 6 x 2
#     col1
#    <int>
#      3
#      2
#      1

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Вы можете использовать stri_reverse из пакета stringi и повернуть строку перед разделением, т.е.

library(tidyverse)

d %>% 
 mutate(col1 = stringi::stri_reverse(col1)) %>% 
 separate_rows(col1)

, что дает

A tibble: 3 x 1
  col1 
  <chr>
1 3    
2 2    
3 1    
0 голосов
/ 29 июня 2018

Мы можем инвертировать кадр данных и выбрать индексы в обратном порядке, используя slice

library(tidyverse)
separate_rows(d, col1, convert = TRUE) %>%
   slice(n():1)

#   col1
#   <int>
#1     3
#2     2
#3     1

Для нескольких строк на примере @ Spacedman

d = data.frame(col1=c("23,34,99","9,3,2"),stringsAsFactors=FALSE)

Приведенное выше решение даст

separate_rows(d, col1, convert = TRUE) %>%
     slice(n():1)
# A tibble: 6 x 1
     col1
    <int>
#1     2
#2     3
#3     9
#4    99
#5    34
#6    23

Однако в случае, если OP необходимо перевернуть строку для каждой строки отдельно, мы можем создать столбец group с row_number и затем перевернуть строку для каждой строки в отдельности, как предложено @ Sotos

d %>%
  mutate(group = row_number()) %>%
  separate_rows(col1, convert = TRUE) %>%
  group_by(group) %>%
  slice(n():1) %>%
  ungroup() %>%
  select(-group)


# A tibble: 6 x 1
#   col1
#  <int>
#1    99
#2    34
#3    23
#4     2
#5     3
#6     9
0 голосов
/ 29 июня 2018

Разбить столбец на запятые, обратить вектор, построить фрейм данных.

Пример данных:

> d = data.frame(col1=c("23,34,99","9,3,2"),stringsAsFactors=FALSE)
> d
      col1
1 23,34,99
2    9,3,2

Do:

> data.frame(col1=do.call(c,lapply(strsplit(d$col1,","),rev)))
  col1
1   99
2   34
3   23
4    2
5    3
6    9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...