2016-09-23 64 views
3

我有一个数据集(nm),如下所示,其中前三列显示用户正在使用该产品,即1(是)还是0(不)。接下来的三列显示的是喜欢那个地方A_TT对应A_TT_1.1,同样产品的百分比:根据多个条件排名

nm 

A_TT B_TT C_TT A_TT_1.1 B_TT_2.1 C_TT_3.1 
0  0  1  0.06  0.84  0.89 
1  1  0  0.92  0.83  0.94 
0  1  0  0.09  0.9  0.13 
1  0  1  0.87  0.05  0.9 
0  0  0  0.13  0.11  0.14 

我想在数据集添加两列(纳米),即秩1 &秩2,居前两位具有以下两个条件的百分比:

a)仅在前三列中值为“零”的位置选择并排名
b)在等级列中,它应返回其列名。

最终的输出应该是:

nm 

A_TT B_TT C_TT A_TT_1.1 B_TT_2.1 C_TT_3.1 Rank 1 Rank 2 
0   0  1  0.06  0.84  0.89  B_TT_2.1 A_TT_1.1 
1   1  0  0.92  0.83  0.94  C_TT_3.1 NONE 
0   1  0  0.09  0.9  0.13  C_TT_3.1 A_TT_1.1 
1   0  1  0.87  0.05  0.9  B_TT_2.1 NONE 
0   0  0  0.13  0.11  0.14  C_TT_3.1 A_TT_1.1 

我已经尝试了许多选择,但没有任何工程。预先感谢您提供解决方案。

回答

2

我们可以apply在行

nm[paste0("Rank", 1:2)] <- t(apply(nm, 1, FUN = function(x) { 
         i1 <- !x[1:3] #logical index giving TRUE for 0 
         x1 <- x[4:6][i1] #subset elements 4:6 based on i1 
         names(x1[order(-x1)])[1:2] #order the 'x1', extract names 
          })) 
nm 
# A_TT B_TT C_TT A_TT_1.1 B_TT_2.1 C_TT_3.1 Rank1 Rank2 
#1 0 0 1  0.06  0.84  0.89 B_TT_2.1 A_TT_1.1 
#2 1 1 0  0.92  0.83  0.94 C_TT_3.1  <NA> 
#3 0 1 0  0.09  0.90  0.13 C_TT_3.1 A_TT_1.1 
#4 1 0 1  0.87  0.05  0.90 B_TT_2.1  <NA> 
#5 0 0 0  0.13  0.11  0.14 C_TT_3.1 A_TT_1.1 

注指定MARGIN = 1循环做到这一点:除了“无”,最好是有NA的缺失值,因为它是更容易去除这些值与功能is.na/complete.cases/na.rm/na.omit

1

这里是另一个尝试:

x <- df[,1:3] 
y <- df[,4:6] 
y[x==1] <- NA 
z <- t(apply(y,1,function(x) colnames(y)[order(x, decreasing = T, na.last = T)]))[,1:2] 
z[rowSums(!x)==1, 2] <- NA 
df[,c("Rank1","Rank2")] <- z 

# A_TT B_TT C_TT A_TT_1.1 B_TT_2.1 C_TT_3.1 Rank1 Rank2 
# 1 0 0 1  0.06  0.84  0.89 B_TT_2.1 A_TT_1.1 
# 2 1 1 0  0.92  0.83  0.94 C_TT_3.1  <NA> 
# 3 0 1 0  0.09  0.90  0.13 C_TT_3.1 A_TT_1.1 
# 4 1 0 1  0.87  0.05  0.90 B_TT_2.1  <NA> 
# 5 0 0 0  0.13  0.11  0.14 C_TT_3.1 A_TT_1.1