разбить и упорядочить строковые данные столбца - PullRequest
0 голосов
/ 02 ноября 2018

плохо знаком с R, так что я немного растерялся. У меня есть набор данных с различными переменными, включая следующий столбец "drink_daily":

drink_daily <- c("(ID 3) Cola & (ID 1) Sprite",
  "(ID 1) Sprite & (ID 3) Cola",
  "(ID 2) water & (ID 3) Cola & (ID 4) Other",
  "(ID 3) Cola & (ID 1) Sprite & (ID 2) water")

и т.д.

Мне нужно получить что-то подобное в кадре данных:

[1] "1" & "3"
[2] "1" & "3"
[3] "2" & "3" & "4"
[4] "1" & "2" & "3"
  • а) Я бы хотел, чтобы все строки были в алфавитном (1-4) порядке
  • б) разбить строки в столбце на 4 переменные
  • c) перекодировать в текст в числа (1-> 4)
  • г) объединить 4 столбца обратно в один

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Я придумал кое-что, что не очень красиво - отчасти потому, что R, возможно, не лучший инструмент для этого - но это помогает.

Здесь strsplit используется для разбиения блоков, разделенных '&'.
gsub снимает скобки и 'ID'.
as.numeric превращает его в числа (альтернатива: as.integer).
сортировка не требует дополнительных объяснений

В результате получается список векторов со всеми отсортированными идентификаторами. Названия элементов списка являются исходными элементами

df <- c("(ID 3) Cola & (ID 1) Sprite",
        "(ID 1) Sprite & (ID 3) Cola",
        "(ID 2) water & (ID 3) Cola & (ID 4) Other",
        "(ID 3) Cola & (ID 1) Sprite & (ID 2) water")

df2 <- sapply(df,function(x) strsplit(x,split='& *'))

result <- lapply(df2, function(x) {
    sort(as.numeric(gsub(').*','',gsub('\\(ID ','',x))))
})


## Show result:
result
 $`(ID 3) Cola & (ID 1) Sprite`
[1] 1 3

 $`(ID 1) Sprite & (ID 3) Cola`
[1] 1 3

 $`(ID 2) water & (ID 3) Cola & (ID 4) Other`
[1] 2 3 4

 $`(ID 3) Cola & (ID 1) Sprite & (ID 2) water`
[1] 1 2 3
0 голосов
/ 02 ноября 2018

Я рад представить пакет stringi, который немного облегчает работу со строками (хотя такая же структура, как у ответа @ Mr.Flick),

library(stringi)

sapply(stri_extract_all_regex(drink_daily, '\\d+'), function(i) 
                                              paste(sort(as.numeric(i)), collapse = ' & '))

#[1] "1 & 3"     "1 & 3"     "2 & 3 & 4" "1 & 2 & 3"
0 голосов
/ 02 ноября 2018

Вы можете получить помощь из библиотек stringr и purrr. Например

library(purrr)
stringr::str_match_all(drink_daily, "\\(ID (\\d+)\\)") %>% 
  map(function(x) x[,2]) %>% 
  map(as.numeric) %>% 
  map(sort) %>% 
  map_chr(paste, collapse=" & ")
# [1] "1 & 3"     "1 & 3"     "2 & 3 & 4" "1 & 2 & 3"

Мы используем str_match_all, чтобы извлечь число внутри строки "(ID #)", а затем отсортировать их и вставить их вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...