【问题标题】:Splitting rows from a dataset with R doesn't work on PowerBI使用 R 从数据集中拆分行在 PowerBI 上不起作用
【发布时间】:2018-10-19 07:03:55
【问题描述】:

我有一个这种格式的数据集:

#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 无字符调用:[ -> [.data.table -> strsplit Ejecución 昙花一现

我认为...问题可能出在原始格式上吗?这是data.table

感谢@prem,您的示例在 RStudio 上运行良好,我尝试在 PowerBI Script 上执行此脚本,但显示此错误

UseMethod("separate_rows_") 中的错误: 没有适用于“separate_rows_”的方法应用于对象... 错误代码=-2147467259 ExceptionType=Microsoft.PowerBI.Radio.RScriptRuntimeException

当我尝试使用 dplyr 库时,出现以下错误

DataSource.Error: ADO.NET: R 脚本错误。

附加包:'dplyr'

以下对象被 'package:stats' 屏蔽:

过滤,滞后

以下对象被 'package:base' 屏蔽:

相交、setdiff、setequal、联合

UseMethod("separate_rows_") 中的错误: 没有适用于“separate_rows_”的方法应用于类>“函数”的对象 调用:%>% ... 分离行 -> 分离行.default -> 分离行_ 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"), ",")

【问题讨论】:

标签: r data.table strsplit


【解决方案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))

【讨论】:

  • @Ismael 关于您作为后续问题提到的错误 - 是否安装了包 tidyverse 或 (dplyr & tidyr)?
  • 您已经添加了dplyrtidyr,所以您在这方面做得很好。现在您的数据应该在df 数据框中,但似乎并非如此,因此请将您的数据传递给df
  • 很高兴它有帮助!
猜你喜欢
  • 2021-06-17
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
相关资源
最近更新 更多