splitstring и получение всех комбинаций подстрок после значения split с использованием только 1 элемента на комбинацию может происходить из значения перед split - PullRequest
0 голосов
/ 05 июня 2019

Вот та же задача, которую мы решили в Python. Я попытался использовать подобный подход для создания пустого словаря из ключей предварительного разделения (R's strsplit) и распаковки всех соответствующих строк после разделения в качестве значений. Затем следующим шагом является создание всех комбинаций, но в результирующих комбинациях может существовать не более одной предварительно разделенной строки.

Вот мой список ввода:

list('ROOM1-abc',
'ROOM1-def',
'ROOM2-abc',
'ROOM2-lol',
'ROOM3-whatever')

И желаемый результат (с комбинациями по 2 длины (необходимо иметь возможность выбрать длину возвращаемых элементов комбинации)):

['ROOM1-abc', 'ROOM2-lol'],
['ROOM1-abc', 'ROOM3-whatever'],
['ROOM1-def', 'ROOM2-abc'],
['ROOM1-def', 'ROOM2-lol'],
['ROOM1-def', 'ROOM3-whatever'],
['ROOM2-abc', 'ROOM3-whatever'],
['ROOM2-lol', 'ROOM3-whatever']]

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

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Если я правильно понял, то, что вы хотите сделать, это

df <- expand.grid(unlist(lst1), unlist(lst1))
df
             Var1           Var2
1       ROOM1-abc      ROOM1-abc
2       ROOM1-def      ROOM1-abc
3       ROOM2-abc      ROOM1-abc
4       ROOM2-lol      ROOM1-abc
5  ROOM3-whatever      ROOM1-abc
6       ROOM1-abc      ROOM1-def
7       ROOM1-def      ROOM1-def
8       ROOM2-abc      ROOM1-def
9       ROOM2-lol      ROOM1-def
10 ROOM3-whatever      ROOM1-def
11      ROOM1-abc      ROOM2-abc
12      ROOM1-def      ROOM2-abc
13      ROOM2-abc      ROOM2-abc
14      ROOM2-lol      ROOM2-abc
15 ROOM3-whatever      ROOM2-abc
16      ROOM1-abc      ROOM2-lol
17      ROOM1-def      ROOM2-lol
18      ROOM2-abc      ROOM2-lol
19      ROOM2-lol      ROOM2-lol
20 ROOM3-whatever      ROOM2-lol
21      ROOM1-abc ROOM3-whatever
22      ROOM1-def ROOM3-whatever
23      ROOM2-abc ROOM3-whatever
24      ROOM2-lol ROOM3-whatever
25 ROOM3-whatever ROOM3-whatever

Это дает матрицу с всеми возможными комбинациями.Таким образом, отличие от предложения akrun состоит в том, что это также дает вам комбинацию с самим элементом, например, ROOM1-abc |ROOM1-abc и заботится о порядке, следовательно, дает вам, например, ROOM3-что угодно |ROOM1-abc и ROOM3-что угодно |ROOM1-abc.

Если вам не нужен порядок, вы можете удалить строки с помощью duplicate

df[!duplicated(t(apply(df, 1, sort))), ]
             Var1           Var2
1       ROOM1-abc      ROOM1-abc
2       ROOM1-def      ROOM1-abc
3       ROOM2-abc      ROOM1-abc
4       ROOM2-lol      ROOM1-abc
5  ROOM3-whatever      ROOM1-abc
7       ROOM1-def      ROOM1-def
8       ROOM2-abc      ROOM1-def
9       ROOM2-lol      ROOM1-def
10 ROOM3-whatever      ROOM1-def
13      ROOM2-abc      ROOM2-abc
14      ROOM2-lol      ROOM2-abc
15 ROOM3-whatever      ROOM2-abc
19      ROOM2-lol      ROOM2-lol
20 ROOM3-whatever      ROOM2-lol
25 ROOM3-whatever ROOM3-whatever

РЕДАКТИРОВАТЬ

# splits at "-"
split <- strsplit(unlist(lst1), "-")
# adds "-" to each vector
split2 <- lapply(split, function(x){
  c(x[1], "-", x[2])})
# saves everything as a dataframe (if desired)
do.call("cbind.data.frame", split2)
0 голосов
/ 05 июня 2019

Можно сделать combn на list и вернуть list из vector s

library(tidyverse)
combn(lst1, 2, simplify = FALSE) %>%
       map(flatten_chr)

данные

lst1 <- list('ROOM1-abc',
'ROOM1-def',
'ROOM2-abc',
'ROOM2-lol',
'ROOM3-whatever')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...