Разделение строк из набора данных с помощью R не работает в PowerBI

У меня есть набор данных в этом формате:

Origin

#albaran|fecha|cliente|estado|descrip|destinatario|direccion|cp|poblacion|observaciones
#11111|43229|C1|E1|D1|DD1|DIR1|CP1|P1|COLECCIÓN CLÁSICOS DISNEY - Entrega Nº: 11, 12, 13, 14; Grandes Enigmas - Entrega Nº: 5, 6
#22222|43229|C2|E2|D2|DD2|DIR2|CP2|P2|COLECCIÓN CLÁSICOS DISNEY - Entrega Nº: 8, 9; Otro Pedido - Entrega Nº: 1, 2

И мне нужно конвертировать:

Формат

#albaran|fecha|cliente|estado|descrip|destinatario|direccion|cp|poblacion|pedido|entregas
#11111|43229|C1|E1|D1|DD1|DIR1|CP1|P1|COLECCIÓN CLÁSICOS DISNEY|11, 12, 13, 14
#11111|43229|C1|E1|D1|DD1|DIR1|CP1|P1|Grandes Enigmas|5, 6
#22222|43229|C2|E2|D2|DD2|DIR2|CP2|P2|COLECCIÓN CLÁSICOS DISNEY|8, 9
#22222|43229|C2|E2|D2|DD2|DIR2|CP2|P2|Otro Pedido|1, 2

Я пытаюсь с

library(data.table)

hec1 <- as.data.table(dataset)
res <- hec1[,strsplit(observaciones, split = ";"),by = c("albaran", "fecha", "cliente", "estado", "descrip", "destinatario", "direccion", "cp", "poblacion")]
res[, pedido:= substring(observaciones, 1, regexpr(":", observaciones)-2)][, entregas := substring(observaciones, regexpr(":", observaciones)+2, nchar(observaciones))]
res$V1 <- NULL
res <- res[,strsplit(entregas, split = ","),by = c("albaran", "fecha", "cliente", "estado", "descrip", "destinatario", "direccion", "cp", "poblacion", "tipo_pedido")]
setnames(res, "pedido", "entregas")
res

Но это не работает, покажите мне эту ошибку:

Ошибка в strsplit (observaciones, split = ";"): argumento de tipo no-carácter Вызовы: [-> [.data.table -> strsplit Ejecución interrumpida

Думаю ... может проблема в формате происхождения? Это data.table.

Спасибо @prem, ваш пример хорошо работает в RStudio, я пытаюсь выполнить этот скрипт в PowerBI Script, но покажите мне эту ошибку

Ошибка в UseMethod (отдельные_строчки_): к объекту не применяется применимый метод для "отдельных_ строк_" ... ErrorCode = -2147467259 ExceptionType = Microsoft.PowerBI.Radio.RScriptRuntimeException

Когда я пытаюсь использовать библиотеку dplyr, я получаю следующую ошибку

DataSource.Error: ADO.NET: ошибка сценария R.

Прикрепление пакета: 'dplyr'

Следующие объекты замаскированы из 'package: stats':

фильтр, лаг

Следующие объекты замаскированы из package: base:

пересечение, setdiff, setequal, union

Ошибка в UseMethod ("отдельные_ строки_"): нет применимого метода для 'отдельные_ строки_', примененного к объекту класса> "функция". Вызовы:%>% ... отдельные строки -> отдельные строки по умолчанию -> отдельные строки_ Ejecución interrumpida

Этот пакет совместим с PowerBI https://docs.microsoft.com/es-es/power-bi/service-r-packages-support

Это код, я не могу использовать tidyverse, потому что он несовместим.

library(ggplot2)
library(tibble)
library(tidyr)
library(readr)
library(ggplot2)
library(stringr)
library(forcats)
library(dplyr)


df %>%
  separate_rows("observaciones", sep = ";") %>%
  separate(observaciones, c("pedido", "entregas"), " - Entrega Nº ")

Проблема решена, спасибо @Prem

Это финальная версия:

library(ggplot2)
library(tibble)
library(tidyr)
library(readr)
library(ggplot2)
library(stringr)
library(forcats)
library(dplyr)
library(data.table)

df <- as.data.table(dataset)
df <- df %>%
  separate_rows("observaciones", sep = ";") %>%
  separate(observaciones, c("pedido", "entregas"), " - Entrega Nº:")
df <- df %>%
  separate_rows("entregas", sep = ", ") %>%
  separate(entregas, c("entregas"), ",")
df <- df %>%
  separate_rows("entregas", sep = "y") %>%
  separate(entregas, c("entregas"), ",")

person Ismael Valle    schedule 09.05.2018    source источник
comment
Пожалуйста, не размещайте изображения данных, они не очень полезны.   -  person talat    schedule 09.05.2018
comment
comment
это идеально подходит для функции tidyr::separate_rows()   -  person Roman    schedule 09.05.2018
comment
См. ?tstrsplit   -  person David Arenburg    schedule 09.05.2018


Ответы (1)


tidyverse подход может быть

library(tidyverse)

df %>%
  separate_rows("observaciones", sep = ";") %>%
  separate(observaciones, c("pedido", "entregas"), " - Entrega Nº ")

Вывод:

  albaran fecha cliente estado descrip destinatario direccion  cp poblacion                    pedido
1   11111 43229      C1     E1      D1          DD1      DIR1 CP1        P1 COLECCIÓN CLÁSICOS DISNEY
2   11111 43229      C1     E1      D1          DD1      DIR1 CP1        P1           Grandes Enigmas
3   22222 43229      C2     E2      D2          DD2      DIR2 CP2        P2 COLECCIÓN CLÁSICOS DISNEY
4   22222 43229      C2     E2      D2          DD2      DIR2 CP2        P2               Otro Pedido
        entregas
1 11, 12, 13, 14
2           5, 6
3           8, 9
4           1, 2

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

df <- structure(list(albaran = c(11111L, 22222L), fecha = c(43229L, 
43229L), cliente = c("C1", "C2"), estado = c("E1", "E2"), descrip = c("D1", 
"D2"), destinatario = c("DD1", "DD2"), direccion = c("DIR1", 
"DIR2"), cp = c("CP1", "CP2"), poblacion = c("P1", "P2"), observaciones = c("COLECCIÓN CLÁSICOS DISNEY - Entrega Nº 11, 12, 13, 14; Grandes Enigmas - Entrega Nº 5, 6", 
"COLECCIÓN CLÁSICOS DISNEY - Entrega Nº 8, 9; Otro Pedido - Entrega Nº 1, 2"
)), .Names = c("albaran", "fecha", "cliente", "estado", "descrip", 
"destinatario", "direccion", "cp", "poblacion", "observaciones"
), class = "data.frame", row.names = c(NA, -2L))
person 1.618    schedule 09.05.2018
comment
@Ismael Относительно ошибки, которую вы упомянули в качестве дополнительного вопроса - установлен ли пакет tidyverse или (dplyr & tidyr)? - person 1.618; 09.05.2018
comment
Вы уже добавили dplyr & tidyr, так что вы хорошо разбираетесь в этом вопросе. Теперь ваши данные должны быть в df фрейме данных, что, похоже, не так, поэтому передайте свои данные в df. - person 1.618; 09.05.2018
comment
Рад, что помог! - person 1.618; 10.05.2018