首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dataframe的循环要花费太长时间

使用dataframe的循环要花费太长时间
EN

Stack Overflow用户
提问于 2022-07-20 15:58:12
回答 1查看 42关注 0票数 0

我正试图优化一个for循环,因为需要这么长时间(比如1.30分钟)。我试过了,但没有成功。循环比较两个数据帧的两列,并校正两列匹配的数据。大数据帧( dataframe,datapmi)非常大(200000行),校正行不多(400行)。我的方法是循环小元素,并在大数据帧中找到该元素的位置,然后替代修正后的版本。任何帮助都会很好,谢谢

代码语言:javascript
复制
  for(j in (1:nrow(correccionpmis))){
   corr<-which(datapmi$PMIGTDTipo==correccionpmis$PMIGTDTipo[j])
   datapmi$PMI[corr]<-correccionpmis$PMIcorregido[j]
   datapmi$Inspection_Procedure[corr]<-correccionpmis$Tipocorregido[j]
  }

更正数据管理系统是具有正确名称的更正数据,而datapmi是原始数据。

它们看起来如下(简化):

代码语言:javascript
复制
> head(datapmi)
                         PMI Inspection_Procedure                                                            PMIGTDTipo
1          Presión Autoclave       Single Numeric Presión Autoclave Presión del autoclave tras 7 minutos Single Numeric
2       Tiempo Presurización       Single Numeric              Tiempo Presurización Tiempo hasta 6 bares Single Numeric
3                Videoscopio              Boolean        Videoscopio Control videoscopio OK s/ficha de producto Boolean
4        Hora Arranque Ciclo       Single Numeric                      Hora Arranque Ciclo Hora de ciclo Single Numeric
5 Tiempo de despresurización       Single Numeric  Tiempo de despresurización Tiempo de despresurización Single Numeric
6                 Peso Molde       Single Numeric                              Peso Molde Peso del Molde Single Numeric

 
> head(correccionpmis)
                                          PMIcorregido
1  Aceptabilidad Geometría Interna del Vano 2 con P/NP
4                               (2) DROSS TEST INICIAL
10                          Aceptabilidad de Inclusión
16                            Aceptabilidad de Rechupe
17                  Adjuntar las placas en SAP (SI/NO)
19                TIEMPO HASTA 1450ºC (PRUEBA PIRO TC)
                                                                                                                                                                                           PMITipo
1                                                                          Aceptabilidad Geometría Interna del Vano 2 con P/NP Indicar Aceptabilidad Geometría Interna del Vano 2 con P/NP Boolean
4                                                                                                          (2) TEST ESCORIAS INICIAL (2) Anotar Valor Dross Test (ANTES DE AFINADO) Single Numeric
10                                                                                                                            Aceptabilidad de inclusiones Indicar Aceptabilidad Inclusión Boolean
16                                                                                                                                     Aceptabilidad Rechupe Indicar Aceptabilidad Rechupe Boolean
17                                                                                                            Adjuntar las placas en SAP (SI/NO) Adjuntar las placas en SAP (SI/NO) Single Numeric
19 BACKUP CALIENTE TIEMPO HASTA 1450ºC (PRUEBA PIRO TC) BACKUP CALIENTE *SI SE HACE PRUEBA Piro-Tc Tiempo desde inicio de fusión hasta que el caldo alcance los 1450ºC (en minutos) Single Numeric
                                                                                                                                                                                        PMIGTDTipo
1                                                                          Aceptabilidad Geometría Interna del Vano 2 con P/NP Indicar Aceptabilidad Geometría Interna del Vano 2 con P/NP Boolean
4                                                                                                          (2) TEST ESCORIAS INICIAL (2) Anotar Valor Dross Test (ANTES DE AFINADO) Single Numeric
10                                                                                                                            Aceptabilidad de inclusiones Indicar Aceptabilidad Inclusión Boolean
16                                                                                                                                     Aceptabilidad Rechupe Indicar Aceptabilidad Rechupe Boolean
17                                                                                                            Adjuntar las placas en SAP (SI/NO) Adjuntar las placas en SAP (SI/NO) Single Numeric
19 BACKUP CALIENTE TIEMPO HASTA 1450ºC (PRUEBA PIRO TC) BACKUP CALIENTE *SI SE HACE PRUEBA Piro-Tc Tiempo desde inicio de fusión hasta que el caldo alcance los 1450ºC (en minutos) Single Numeric

这是我尝试过的,但它不起作用(而且也花了很长时间)

代码语言:javascript
复制
mi_fun <- function(i) {
   corr<-which(datapmi$PMIGTDTipo==correccionpmis$PMIGTDTipo[i])
  datapmi$PMI[corr]<-correccionpmis$PMIcorregido[i]
  datapmi$Inspection_Procedure[corr]<-correccionpmis$Tipocorregido[i]
  print(difftime(Sys.time(),t0))
}

sapply(1:nrow(correccionpmis), mi_fun) 

我在评论中添加了Jon建议的dput函数:

代码语言:javascript
复制
> dput(head(correccionpmis))
structure(list(Linea = c("LINEA NGVS", "FUNDICION", "LINEA NGVS", 
"LINEA NGVS", "RX DIGITAL", "FUNDICION"), PMI = c(" Aceptabilidad Geometría Interna del Vano 2 con P/NP", 
"(2) TEST ESCORIAS INICIAL", "Aceptabilidad de inclusiones", 
"Aceptabilidad Rechupe", "Adjuntar las placas en SAP (SI/NO)", 
"BACKUP CALIENTE TIEMPO HASTA 1450ºC (PRUEBA PIRO TC)"), GTD = c("Indicar Aceptabilidad Geometría Interna del Vano 2 con P/NP", 
"(2) Anotar Valor Dross Test (ANTES DE AFINADO)", "Indicar Aceptabilidad Inclusión", 
"Indicar Aceptabilidad Rechupe", "Adjuntar las placas en SAP (SI/NO)", 
"BACKUP CALIENTE *SI SE HACE PRUEBA Piro-Tc Tiempo desde inicio de fusión hasta que el caldo alcance los 1450ºC (en minutos)"
), Tipo = c("Boolean", "Single Numeric", "Boolean", "Boolean", 
"Single Numeric", "Single Numeric"), PMIcorregido = c("Aceptabilidad Geometría Interna del Vano 2 con P/NP", 
"(2) DROSS TEST INICIAL", "Aceptabilidad de Inclusión", "Aceptabilidad de Rechupe", 
"Adjuntar las placas en SAP (SI/NO)", "TIEMPO HASTA 1450ºC (PRUEBA PIRO TC)"
), Tipocorregido = c("Boolean", "Single Numeric", "Boolean", 
"Boolean", "Boolean", "Single Numeric"), PMIGTDTipo = c(" Aceptabilidad Geometría Interna del Vano 2 con P/NP Indicar Aceptabilidad Geometría Interna del Vano 2 con P/NP Boolean", 
"(2) TEST ESCORIAS INICIAL (2) Anotar Valor Dross Test (ANTES DE AFINADO) Single Numeric", 
"Aceptabilidad de inclusiones Indicar Aceptabilidad Inclusión Boolean", 
"Aceptabilidad Rechupe Indicar Aceptabilidad Rechupe Boolean", 
"Adjuntar las placas en SAP (SI/NO) Adjuntar las placas en SAP (SI/NO) Single Numeric", 
"BACKUP CALIENTE TIEMPO HASTA 1450ºC (PRUEBA PIRO TC) BACKUP CALIENTE *SI SE HACE PRUEBA Piro-Tc Tiempo desde inicio de fusión hasta que el caldo alcance los 1450ºC (en minutos) Single Numeric"
)), row.names = c(1L, 4L, 10L, 16L, 17L, 19L), class = "data.frame")

> dput(head(datapmi))
structure(list(Linea = c("PREPARACION DE MOLDE", "PREPARACION DE MOLDE", 
"PREPARACION DE MOLDE", "PREPARACION DE MOLDE", "PREPARACION DE MOLDE", 
"CERAMICAS"), Nodo = c("MOLDE_PREPARACION DE MOLDE", "MOLDE_PREPARACION DE MOLDE", 
"MOLDE_PREPARACION DE MOLDE", "MOLDE_PREPARACION DE MOLDE", "MOLDE_PREPARACION DE MOLDE", 
"MOLDE_CERAMICAS"), PuestoID = c("PP009C", "PP009C", "PP009C", 
"PP009C", "PP009C", "PP058C"), Puesto = c("Descerado + Quemado", 
"Descerado + Quemado", "Descerado + Quemado", "Descerado + Quemado", 
"Descerado + Quemado", "Baños ceramicos Agua 2 - R4"), PartNumber = c("11013340", 
"11013340", "11013340", "11013340", "11013340", "11013340"), 
    SerialNumber = c("16817", "16817", "16817", "16817", "16817", 
    "16895"), OrdenFab = c("226489169", "226489169", "226489169", 
    "226489169", "226489169", "226489725"), OP = c(600L, 600L, 
    600L, 600L, 600L, 500L), OF_OP = c("226489169_600", "226489169_600", 
    "226489169_600", "226489169_600", "226489169_600", "226489725_500"
    ), FechaFin_OP = structure(c(NA, NA, NA, NA, NA, 1591602784
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Status_OP = c("Partial", 
    "Partial", "Partial", "Partial", "Partial", "Complete"), 
    Zone = c("", "", "", "", "", ""), PMI = c("Presión Autoclave", 
    "Tiempo Presurización", "Videoscopio", "Hora Arranque Ciclo", 
    "Tiempo de despresurización", "Peso Molde"), GTD = c("Presión del autoclave tras 7 minutos", 
    "Tiempo hasta 6 bares", "Control videoscopio OK s/ficha de producto", 
    "Hora de ciclo", "Tiempo de despresurización", "Peso del Molde"
    ), Dimension_Type = c("", "", "", "", "", ""), Metodo_Medicion = c("Display microtol", 
    "Cronómetro", "Videoscopio", "Reloj", "Cronómetro", "Báscula"
    ), Frecuencia = c("100%", "100%", "100%", "100%", "100%", 
    "100%"), PMI_Descripcion = c("Presión Autoclave Presión del autoclave tras 7 minutos-Nominal:9.750000 Lim Sup:10.000000 Lim Inf:8.500000", 
    "Tiempo Presurización Tiempo hasta 6 bares-Nominal:4.000000 Lim Sup:4.400000 Lim Inf:0.000000", 
    "Videoscopio Control videoscopio OK s/ficha de producto", 
    "Hora Arranque Ciclo Hora de ciclo-Nominal:0.000000 Lim Sup:2400.000000 Lim Inf:0.000000", 
    "Tiempo de despresurización Tiempo de despresurización-Nominal:3.000000 Lim Sup:8.000000 Lim Inf:0.000000", 
    "Peso Molde Peso del Molde-Nominal:59.900000 Lim Sup:64.400000 Lim Inf:55.400000"
    ), PMI_Rango = c("9.750 (8.500-10.00)", "4.000 (0.000-4.400)", 
    "", "0.000 (0.000- 2400)", "3.000 (0.000-8.000)", "59.90 (55.40-64.40)"
    ), Inspection_Procedure = c("Single Numeric", "Single Numeric", 
    "Boolean", "Single Numeric", "Single Numeric", "Single Numeric"
    ), Criticidad = c("MINOR", "MINOR", "MINOR", "MINOR", "MINOR", 
    "MINOR"), LimInf = c(8.5, 0, 0, 0, 0, 55.4000015258789), 
    LimSup = c(10, 4.40000009536743, 0, 2400, 8, 64.4000015258789
    ), Nominal = c(9.75, 4, 0, 0, 3, 59.9000015258789), Es_Obligatoria = c("1", 
    "1", "1", "1", "1", "1"), Valor = c("9,5", "3,61", "1", "10", 
    "7", "63,6"), Estatus_PMI = c("Complete", "Complete", "Complete", 
    "Complete", "Complete", "Complete"), Usuario = c("82300", 
    "82300", "82300", "82300", "82300", "82127"), Comentarios = c("", 
    "", "", "", "", ""), Fecha_Registro = structure(c(1591269448, 
    1591269267, 1591269303, 1591269285, 1591269458, 1591595580
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Responsable = c("Operator", 
    "Operator", "Operator", "Operator", "Operator", "Operator"
    ), NCP_ID = c("NCP_2020_9881", "NCP_2020_9881", "NCP_2020_9881", 
    "NCP_2020_9881", "NCP_2020_9881", NA), GrupoDefecto = c("Genérico", 
    "Genérico", "Genérico", "Genérico", "Genérico", NA), Defecto = c("Incorrecto", 
    "Incorrecto", "Incorrecto", "Incorrecto", "Incorrecto", NA
    ), NCP_status = c("APROBADO", "APROBADO", "APROBADO", "APROBADO", 
    "APROBADO", NA), año = structure(c(1577836800, 1577836800, 
    1577836800, 1577836800, 1577836800, 1577836800), class = c("POSIXct", 
    "POSIXt"), tzone = "UTC"), cuatri = structure(c(1585699200, 
    1585699200, 1585699200, 1585699200, 1585699200, 1585699200
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), mes = structure(c(1590969600, 
    1590969600, 1590969600, 1590969600, 1590969600, 1590969600
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), semana = structure(c(1590969600, 
    1590969600, 1590969600, 1590969600, 1590969600, 1591574400
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), dia = structure(c(1591228800, 
    1591228800, 1591228800, 1591228800, 1591228800, 1591574400
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), PMIGTDTipo = c("Presión Autoclave Presión del autoclave tras 7 minutos Single Numeric", 
    "Tiempo Presurización Tiempo hasta 6 bares Single Numeric", 
    "Videoscopio Control videoscopio OK s/ficha de producto Boolean", 
    "Hora Arranque Ciclo Hora de ciclo Single Numeric", "Tiempo de despresurización Tiempo de despresurización Single Numeric", 
    "Peso Molde Peso del Molde Single Numeric")), row.names = c(NA, 
6L), class = "data.frame")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-20 18:38:42

我的评论倒过来了,我想你想:

代码语言:javascript
复制
library(dplyr)
datapmi %>%
  left_join(correccionpmis, by = "PMIGTDTipo") %>%
  mutate(PMI = coalesce(PMI.y, PMI.x),
         Inspection_Procedure = coalesce(Tipocorregido, Inspection_Procedure))

这将获取datapmi的每一行,通过PMIGTDTipo列将其匹配到对应的correccionpmis行,然后将PMI和Inspection_Prodedure列替换为替换值(如果可用的话)。在第一种情况下,这两个表都有一个PMI列,因此原始表被重命名为PMI.x,它加入的表是PMI.y,因此我们首先查找替换,如果找不到(NA),则使用原始PMI

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73054754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档