2015-03-03 46 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