使用双列条件替换数据框中的值

时间:2016-11-17 08:02:12

标签: r dataframe replace

我有以下情况: 具有以下结构的数据帧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

由于

1 个答案:

答案 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 ...但是没有想到以优雅的方式做到这一点的方法。

如果没有其他回复,我可能会稍后尝试破解这个坚果。