Nano Hash - криптовалюты, майнинг, программирование

разделить строку без потери символов

Я хочу разделить строки на определенный символ, сохранив этот символ во второй результирующей строке. Я могу выполнить почти все желаемые операции, за исключением того, что я теряю символы, которые я указываю в strsplit, который, я думаю, называется разделителем.

Есть ли способ запросить, чтобы strsplit сохранил разделитель? Или я должен использовать какое-то регулярное выражение? Спасибо за любой совет. Это кажется очень простым вопросом. Извините, если это дубликат. Я предпочитаю использовать базу R.

Вот пример, показывающий, что у меня есть до сих пор:

my.table <- read.table(text = '
                                                            model npar     AICc 
 AA(~region+state+county+city)BB(~region+state+county+city)CC(~1)   17 11111.11
         AA(~region+state+county)BB(~region+state+county)CC(~123)   14 22222.22
                        AA(~region+state)BB(~region+state)CC(~33)   13 33333.33
                                  AA(~region)BB(~region)CC(~4321)    6 44444.44
', header = TRUE, stringsAsFactors = FALSE)

desired.result <- read.table(text = '
                                                      model        CC npar     AICc
 AA(~region+state+county+city)BB(~region+state+county+city)    CC(~1)   17 11111.11
           AA(~region+state+county)BB(~region+state+county)  CC(~123)   14 22222.22
                         AA(~region+state)BB(~region+state)   CC(~33)   13 33333.33
                                     AA(~region)BB(~region) CC(~4321)    6 44444.44
', header = TRUE, stringsAsFactors = FALSE)

split.model  <- strsplit(my.table$model, 'CC\\(')

split.models <- matrix(unlist(split.model), ncol=2, byrow=TRUE, dimnames = list(NULL, c("model", "CC")))

desires.result2 <- data.frame(split.models, my.table[,2:ncol(my.table)])
desires.result2

#                                                       model     CC npar     AICc
# 1 AA(~region+state+county+city)BB(~region+state+county+city)    ~1)   17 11111.11
# 2           AA(~region+state+county)BB(~region+state+county)  ~123)   14 22222.22
# 3                         AA(~region+state)BB(~region+state)   ~33)   13 33333.33
# 4                                     AA(~region)BB(~region) ~4321)    6 44444.44
12.07.2013

Ответы:


1

Основная идея состоит в том, чтобы использовать look-around операции из регулярных выражений в strsplit для получения желаемого результата. Однако это немного сложнее, чем с strsplit и положительным прогнозом. Прочтите этот отличный пост от @JoshO'Brien за объяснение.

pattern <- "(?<=\\))(?=CC)"
strsplit(my.table$model, pattern, perl=TRUE)
# [[1]]
# [1] "AA(~region+state+county+city)BB(~region+state+county+city)"
# [2] "CC(~1)"                                                    

# [[2]]
# [1] "AA(~region+state+county)BB(~region+state+county)"
# [2] "CC(~123)"                                        

# [[3]]
# [1] "AA(~region+state)BB(~region+state)" "CC(~33)"                           

# [[4]]
# [1] "AA(~region)BB(~region)" "CC(~4321)"             

Конечно, я оставляю задачу do.call(rbind, ...) и cbind получить окончательный desired.output на вас.

12.07.2013

2

Почти сразу после публикации я подумал об использовании gsub для вставки пробела, а затем разделения на пробел. Хотя мне больше нравится ответ Аруна.

my.table <- read.table(text = '
                                                            model npar     AICc 
 AA(~region+state+county+city)BB(~region+state+county+city)CC(~1)   17 11111.11
         AA(~region+state+county)BB(~region+state+county)CC(~123)   14 22222.22
                        AA(~region+state)BB(~region+state)CC(~33)   13 33333.33
                                  AA(~region)BB(~region)CC(~4321)    6 44444.44
', header = TRUE, stringsAsFactors = FALSE)

my.table$model <- gsub("CC", " CC", my.table$model)

split.model <- strsplit(my.table$model, ' ')

split.models <- matrix(unlist(split.model), ncol=2, byrow=TRUE, dimnames = list(NULL, c("model", "CC")))

desires.result <- data.frame(split.models, my.table[,2:ncol(my.table)])
desires.result

#                                                        model        CC npar     AICc
# 1 AA(~region+state+county+city)BB(~region+state+county+city)    CC(~1)   17 11111.11
# 2           AA(~region+state+county)BB(~region+state+county)  CC(~123)   14 22222.22
# 3                         AA(~region+state)BB(~region+state)   CC(~33)   13 33333.33
# 4                                     AA(~region)BB(~region) CC(~4321)    6 44444.44
12.07.2013
  • если вы собираетесь sub, то просто выполните sub('.*(CC.*)', '\\1', model) и sub('CC.*', '', model), чтобы получить две части (при условии, что у вас есть 2 части) 13.07.2013

  • 3

    ... почему бы просто не прикрепить разделитель обратно после этого? Казалось бы, это избавит вас от многих проблем с регулярными выражениями.

    split.model <- lapply(strsplit(my.table$model, 'CC\\('), function(x) {
        x[2] <- paste0("CC(", x[2])
        x
    })
    
    13.07.2013
  • Да, но: 1) ограничение этого метода наступает (не для этого вопроса, а вообще), когда нужно искать, например, CA, CB, CC, CD и CE и разделить строку, а если CF, CG, ... не. 2) Вы, по сути, перебираете все строки и вставляете их еще раз, что может быть неэффективно для больших данных (еще не проверено). 14.07.2013
  • @arun Это был ответ на поставленный конкретный вопрос: как искать определенную строку, не избавляясь от нее. И если вы не имеете дело с невероятно большим количеством случаев (миллионы?), все предлагаемые решения в основном мгновенны. Кроме того, как говорится, у вас есть время на исполнение и на то, чтобы писать. Время, затраченное на создание подходящего регулярного выражения, вероятно, превысит время, затраченное на его запуск. 14.07.2013
  • На самом деле, для data.frame из 40 тыс. строк это решение занимает 0,8 секунды, тогда как решение с регулярным выражением занимает 0,065 секунды. Теперь мы можем спорить о том, много ли 0,8 секунды в смысле кодирования. Кажется, я уже упоминал, что ограничение есть в общем сценарии. Однако тенденция, которую я наблюдал в SO (по крайней мере, под тегом R), заключается в предоставлении общего и эффективного решения, где это возможно. На самом деле, чтобы написать мое решение, требуется 72 символа, а ваше определенно будет больше. Итак, вы на самом деле имеете в виду время на обдумывание. Думаю, у меня другой взгляд на это. 14.07.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..