优化嵌套for循环中的处理时间 - R.

时间:2016-10-07 13:06:56

标签: r

我有两个24k和15k行的数据集。我使用嵌套for循环来重写一些数据......但是计算操作需要花费很长时间。

是否有人建议如何优化代码以加快流程?

我的代码:

for(i in 1:length(data$kolicina)){
  for(j in 1:length(df$kolicina)){
    if(data$LIXcode[i] == df$LIXcode[j]){
      data$kolicina[i] <- df$kolicina[j]
    }
  }
}

带有输入的完整代码如下所示:

df <- data[grepl("Trennscheiben", data$a_naziv) & data$SestavKolicina > 1,]
for(i in 1:length(df$kolicina)){
  df$kolicina[i] <- df$kolicina[i] / 10
}

for(i in 1:length(data$kolicina)){
  for(j in 1:length(df$kolicina)){
    if(data$LIXcode[i] == df$LIXcode[j]){
      data$kolicina[i] <- df$kolicina[j]
    }
  }
}

数据:

LIXcode         a_naziv                 RacunCenaNaEM   kolicina
LIX2017396957   MINI HVLP Spritzpistole   20,16           1
LIX2017396957   MINI HVLP Spritzpistole   20,16           1
LIX2017396963   Trennscheiben Ø115 Ø12    12,53           30
LIX2017396963   Trennscheiben Ø115 Ø12    12,53           1

2 个答案:

答案 0 :(得分:0)

我还没有在我自己的机器上试过这个,但这应该可行

fun <- function(x,y){
  x[which(x$LIXcode %in% y$LIXcode)]$kolicina = 
  y[which(x$LIXcode %in% y$LIXcode)]$kolicina
  }
}

fun(data,df)

R有能力并行完成所有这些

答案 1 :(得分:0)

据我了解,该问题涉及表“dt1”,其中包含键列“a”以及任意数量的值列和任意数量的观察值。然后我们有一个“dt2”,它有某种映射 - 这意味着列“a”具有唯一值,而某些列“b”具有需要写入“dt1”的值,其中列“a”匹配。 / p>

我建议加入表格:

require(data.table)

dt1 <- data.table(a = sample(1:10, 1000, replace = T),
           b = sample(letters, 1000, replace = T))

dt2 <- data.table(a = 1:10,
                  b = letters[1:10])

output <- merge(dt1, dt2, by = "a", all.x = T)

你也可以尝试:

dt1[,new_value:=dt2$b[match(a, dt2$a)]

这两种解决方案都是矢量化的,因此几乎是即时的。

基础解决方案(没有data.table语法,虽然我强烈建议您学习它):

dt1$new_value <- dt2$b[match(dt1$a, dt2$a)]

如果我正确地理解了这个问题,那就是......

这是一个适应预期输出的工作解决方案:

dt1[a %in% dt2$a, b:=dt2$b[match(a, dt2$a)]]