2017-12-27 441 views
1

新列有類似的優先級列表:從一個二進制數據幀像下面生產基於優先級列表

Google: High priority 
Yahoo: medium priority 
Microsoft: low priority 

> df <- data.frame(id = c(1,2,3), Google = c(1,1,0), Yahoo = c(1,1,1), Microsoft = c(0,1,1)) 
> df 
    id Google Yahoo Microsoft 
1 1  1  1   0 
2 2  1  1   1 
3 3  0  1   1 

怎麼可能產生一個新的數據框在其中列是相同的,但取決於優先級,只有具有最高優先級的列有1保留,而另一列在每一行中取0。預期結果的

例子:

> df <- data.frame(id = c(1,2,3), Google = c(1,1,0), Yahoo = c(0,0,1), Microsoft = c(0,0,0)) 
> df 
    id Google Yahoo Microsoft 
1 1  1  0   0 
2 2  1  0   0 
3 3  0  1   0 
+1

嘗試'DF [-1] < - T(申請(DF [-1],1,函數(X){I1 < - 這(X == MAX(X))[1];替換(x,(i1 + 1):length(x),0)}))' – akrun

回答

2

使用:

mc <- max.col(df[-1], ties.method = 'first') 
df[-1] <- 0 
df[cbind(1:nrow(df), mc + 1)] <- 1 

給出:

> df 
    id Google Yahoo Microsoft 
1 1  1  0   0 
2 2  1  0   0 
3 3  0  1   0 

如果公司列不在優先順序,可以改變:

1

我們也可以使用apply功能:

df[-1]= t(apply(df[-1], 1, function(x)`[<-`(x,-which.max(x),0))) 
df 
    id Google Yahoo Microsoft 
1 1  1  0   0 
2 2  1  0   0 
3 3  0  1   0