【问题标题】:Extract values corresponding to top k of any other column提取与任何其他列的 top k 对应的值
【发布时间】:2016-01-24 22:33:24
【问题描述】:

我如何在一张表中获取 'x' 的值对应于 'y' 和 'z' 的前 k 个值?

> dt <- data.table( x = letters[c(1, 1, 3, 2, 3, 1, 1)],
                    y = c(1, 2, 1, 2, 2, 1, 1), z = c(1, 2, 3) )
> dt
   x y z
1: a 1 1
2: a 2 2
3: c 1 3
4: b 2 1
5: c 2 2
6: a 1 3
7: a 1 1

这种情况可以通过连接解决,还是我必须遍历不是“x”的列?

> requested.output
   var x Val
1:   y a   2
2:   y b   2
3:   y c   2
4:   z c   3
5:   z a   3
6:   z a   2

【问题讨论】:

  • 不应该是 4 5 和 6 而应该是 4: z a 3 5: z b 1 6: z c 3

标签: r join data.table


【解决方案1】:

无需循环或连接,只需根据x列转换为长格式,按value降序排序,并根据variable选择前3行。

melt(dt, id = "x")[order(-value), .SD[1:3], keyby = variable]
#    variable x value
# 1:        y a     2
# 2:        y b     2
# 3:        y c     2
# 4:        z c     3
# 5:        z a     3
# 6:        z a     2

【讨论】:

    【解决方案2】:

    如果有人对dplyrtidyr 解决方案感兴趣。

    dt %>%
        gather(variable, value, -x) %>%
        group_by(variable) %>%
        filter(row_number(-value)<=3) %>%
        ungroup %>%
        arrange(variable, desc(value))
    
    ##      x variable value
    ##  (chr)   (fctr) (dbl)
    ##1     a        y     2
    ##2     b        y     2
    ##3     c        y     2
    ##4     c        z     3
    ##5     a        z     3
    ##6     a        z     2
    

    【讨论】:

      猜你喜欢
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2011-10-22
      • 2012-07-26
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      相关资源
      最近更新 更多