Сочетание data.table и str_extract_all - PullRequest
1 голос
/ 02 марта 2020

Я хочу иметь один столбец для каждого числа в data.table на переменную группировки. Предположим, у меня есть следующие данные:

Data <- data.table(Text = c("123 456", "234 567"), Group = c("A", "B"))
      Text Group
1: 123 456     A
2: 234 567     B

Что я хочу:

      Text Group Number1 Number2
1: 123 456     A     123     456
2: 234 567     B     234     567

Что я пробовал:

Data[, c("Number1", "Number2") := str_extract_all(Text, "\\d+"), Group]

Это дает мне следующее:

Error in `[.data.table`(Data, , `:=`(c("Number1", "Number2"), str_extract_all(Text,  : 
  Supplied 2 items to be assigned to group 1 of size 1 in column 'Number1'. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.

Я знаю, что могу использовать separate, я знаю, что я могу использовать одно регулярное выражение для числа / столбца, но я хочу умное решение в «одной строке» с str_extract_all.

Ответы [ 3 ]

2 голосов
/ 02 марта 2020

Мы можем использовать fread

Data[,  c("Number1", "Number2") := fread(text = Text)][]
1 голос
/ 02 марта 2020

«Однострочное» решение с использованием trstrsplit:

Data[, c("Number1", "Number2") := tstrsplit(Text, " "), Group]
      Text Group Number1 Number2
1: 123 456     A     123     456
2: 234 567     B     234     567
0 голосов
/ 02 марта 2020

Я бы использовал cSplit как есть

splitstackshape::cSplit(Data, "Text", sep = " ", drop = FALSE)

Однако, если вы хотите использовать str_extract_all, мы можем сделать

Data[,paste0("number", 1:2) := purrr::transpose(stringr::str_extract_all(Text, "\\d+"))]
Data

#      Text Group number1 number2
#1: 123 456     A     123     456
#2: 234 567     B     234     567
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...