2016-11-17 75 views
0

我有以下的情况: 甲数据帧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个开始步骤和大约23百万行这一事实而具有优异的性能: 将Stepx列中的数字替换为与列值匹配的Code列中的值,并将第一个0替换为代码列值,获得以下内容:

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

对不起,这是一个错误,我编辑了正确的情况,23米的行和7列的步骤在起始数据框中,我应该有结果相同的行数和1额外的列谢谢评论 –

+0

如果原始数据集有2300万行,是否有与相应的值一样多的代码?如果不是,您的数据中的代码和值如何显示?现在他们每个人都有自己的专栏,就像你的数据一样吗? – LAP

+0

@Leo你的问题的答案是肯定的,在真实情况下的代码栏可以假设从1000开始到50亿的值 –

回答

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必须替换为每一行......但没有想到一种方法来优雅的方式。

如果没有其他答复,我可能会在稍后尝试破解这个螺母。

+0

[R]到目前为止解决的部分的基本代码是:'df1 [,grep(“^ Step”,colnames(df1),value = T] < - lapply(df1 [,grep(“^ Step”, (x,df1 $ Value)]; replace(x1,is.na(x1),0)})(Credit(df1),value = T],function(x){x1 < - df1 $ Code [ (x == 0)),然后'first_null < - sapply(apply(df1 [,grep(“^ Step”,colnames(df1),value = T)],函数(x){x [1]})'我同意矢量化的解决方案似乎不太可能,也许是一个嵌套的'应用'调用行,然后使用像'cumsum'的列? – LAP

+0

我试过嵌套适用于转换StepX矩阵转换为字符串向量,然后尝试用简单的'sub()'替换第一个零...然后将整个事物转换回数字,但不知何故,它变得相当混乱,不想正常工作。找到位置索引(我做了),然后用它们的坐标替换矩阵内的值(我可以认为这里只有'for'循环)将会是更快。 –

+0

另外...它是一种主观的脱离主题,但使用'data.table'后,最终我以某种方式发现'data.frame'冗余。因此没有基础解决方案 –