我有以下情况: 具有以下结构的数据帧df
Code Value Step1 Step2 Step3
123 1 2 4 0
234 2 9 1 4
799 4 0 0 0
311 9 1 2 0
我需要一种方法在另一个数据帧中获得以下情况而不使用循环并且具有很好的性能,因为真实数据帧有8个起始步骤和大约2300万行: 将Stepx列中的数字替换为Code列中与列值匹配的值,并将第一个0替换为Code列值,获取以下内容:
Code Value Step1 Step2 Step3 Step4
123 1 234 799 123 0
234 2 311 123 799 234
799 4 799 0 0 0
311 9 123 234 311 0
由于
答案 0 :(得分:0)
这是部分解决方案:
require(data.table)
x <- data.table(Code = c(123, 234, 799, 311),
value = c(1,2,4,9),
Step1 = c(2,9,0,1),
Step2 = c(4,1,0,2),
Step3 = c(0,4,0,0),
Step4 = c(0,0,0,0))
x[,grep("^Step", colnames(x), value = T):=lapply(x[,grep("^Step", colnames(x), value = T), with = F], function(val) x$Code[match(val, x$value)])]
x[is.na(x)] <- 0
first_null <- apply(x[,grep("^Step", colnames(x), value = T), with = F], 1, function(val) min(which(val == 0)))
它替换每个“StepX”。但是,在不诉诸for
循环的情况下,实现替换第一个null行是有点棘手的。我给了它一个镜头并写了另一个申请来确定哪一步必须为每一行替换null ...但是没有想到以优雅的方式做到这一点的方法。
如果没有其他回复,我可能会稍后尝试破解这个坚果。