【问题标题】:R: condition for each row based on all rowsR:基于所有行的每一行的条件
【发布时间】:2015-03-03 12:56:29
【问题描述】:

如何将行的每个值与表的每个值进行比较?更具体地说,假设我有下表:

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以将rankties.method = "min" 一起使用。

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

    【讨论】:

    • 人们似乎真的很喜欢你的回答,他们甚至不赞成我的回答。也许我应该让 OP 接受你的回答:-)
    • @RStudent 好吧,看来 OP 正在寻找您的答案。 :) 这就是为什么我们既有选票又有 OP 的复选标记。他们不需要同意。
    • @RStudent,我觉得我欠你一个解释。虽然我认为影子的答案是这个特定操作最有趣的答案,但我需要你的答案,因为它更灵活并允许其他操作。比如DT[,count:=sapply(w, function(x) sum(x > w & x < v))]。但问题可能是我问了一个不准确的问题。
    【解决方案2】:

    例如如下:

     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
    

    【讨论】:

    • 非常感谢您。我将结合两个答案,如下所示:DT[,count:=sapply(w, function(x) sum(x &gt; w))]
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2021-12-28
    • 2014-10-30
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多