2016-09-23 68 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