2015-03-03 52 views
0

行的每個值如何與每個表的值進行比較?更具體地說,假設我有下表:R:基於所有行的每行的條件

DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), 
    v=1:9,w=as.integer(rnorm(9)*10)) 

> DT 
## x y v w 
## 1: a 1 1 0 
## 2: a 3 2 0 
## 3: a 6 3 6 
## 4: b 1 4 -4 
## 5: b 3 5 -27 
## 6: b 6 6 10 
## 7: c 1 7 4 
## 8: c 3 8 1 
## 9: c 6 9 7 

我怎麼能找到w的數量大於每個w? 所需的輸出:

> DT1 
## x y v w count 
## 1: a 1 1 0 2 # 0 is greater than -4 and -27 
## 2: a 3 2 0 2 
## 3: a 6 3 6 6 
## 4: b 1 4 -4 1 
## 5: b 3 5 -27 0 
## 6: b 6 6 10 8 
## 7: c 1 7 4 6 
## 8: c 3 8 1 3 
## 9: c 6 9 7 7 

回答

0

舉例如下:

set.seed(123) 
DT$count <- sapply(DT$w, function(x) sum(x > DT$w)) 
DT 
    x y v w count 
1: a 1 1 -5  2 
2: a 3 2 -2  3 
3: a 6 3 15  7 
4: b 1 4 0  4 
5: b 3 5 1  5 
6: b 6 6 17  8 
7: c 1 7 4  6 
8: c 3 8 -12  0 
9: c 6 9 -6  1 
+0

非常感謝你。我將結合如下兩個答案:'DT [,count:= sapply(w,function(x)sum(x> w))]' – DJJ 2015-03-03 21:06:55

5

您可以ties.method = "min"一起使用rank

DT[, count := rank(w, ties.method = 'min') - 1] 
+0

這些人真的很喜歡你的答案,他們甚至低估了我的。也許我應該要求OP接受你的回答:-) – DatamineR 2015-03-03 17:19:39

+0

@RStudent嗯,似乎OP正在尋找你的答案。 :)這就是爲什麼我們同時擁有選票和OP中的複選標記。他們不需要同意。 – shadow 2015-03-03 17:23:37

+2

@RStudent,我覺得我欠你一個解釋。儘管我認爲影子的答案是這個特定操作中最有趣的一個,但我需要你的答案,因爲它更靈活,並允許其他操作。像'DT [,count:= sapply(w,function(x)sum(x> w&x DJJ 2015-03-03 21:02:46