我有两个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
答案 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)]]