【问题标题】:Select top values per column in R在 R 中选择每列的最高值
【发布时间】:2020-03-23 08:19:29
【问题描述】:

这可能是一个基本问题,但我还没有找到适合我需要的答案,即使有很多类似的。

我正在尝试从每列中选择前 3 个值(将行号保留为 id),但我无法找到合适的函数。

我从一开始就有一个这样的矩阵,使用该代码添加 id 列

top_probs <- doc_topic_distr %>% 
  magrittr::set_rownames(seq_len(nrow(.))) %>% 
  as_tibble(rownames = "id") 

    id          V1          V2          V3          V4          V5          V6          V7          V8          V9          V10          V11          V12
1   1       0.000000000 0.000000000 0.133333333 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.181481481 0.685185185
2   2       0.950000000 0.000000000 0.050000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
3   3       0.028571429 0.114285714 0.814285714 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.014285714 0.028571429
4   4       0.000000000 0.000000000 0.000000000 0.002127660 0.240425532 0.136170213 0.408510638 0.076595745 0.000000000 0.000000000 0.000000000 0.136170213
5   5       0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.025000000 0.025000000 0.050000000 0.900000000
6   6       0.000000000 0.000000000 0.000000000 0.000000000 0.076923077 0.384615385 0.000000000 0.000000000 0.000000000 0.000000000 0.284615385 0.253846154
7   7       0.000000000 0.000000000 0.347826087 0.000000000 0.000000000 0.000000000 0.243478261 0.000000000 0.026086957 0.000000000 0.143478261 0.239130435
8   8       0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.024000000 0.004000000 0.000000000 0.460000000 0.000000000 0.224000000 0.288000000
9   9       0.000000000 0.000000000 0.311111111 0.000000000 0.011111111 0.000000000 0.011111111 0.000000000 0.000000000 0.000000000 0.388888889 0.277777778
10  10      0.000000000 0.466666667 0.000000000 0.000000000 0.000000000 0.266666667 0.200000000 0.000000000 0.066666667 0.000000000 0.000000000 0.000000000
11  11      0.000000000 0.153333333 0.006666667 0.000000000 0.000000000 0.826666667 0.000000000 0.013333333 0.000000000 0.000000000 0.000000000 0.000000000
12  12      0.295833333 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.404166667 0.004166667 0.000000000 0.000000000 0.000000000 0.295833333
13  13      0.000000000 0.000000000 0.000000000 0.000000000 0.009090909 0.790909091 0.154545455 0.009090909 0.009090909 0.000000000 0.027272727 0.000000000
14  14      0.000000000 0.155555556 0.000000000 0.000000000 0.000000000 0.033333333 0.033333333 0.011111111 0.000000000 0.533333333 0.011111111 0.222222222
15  15      0.055555556 0.000000000 0.533333333 0.000000000 0.000000000 0.000000000 0.177777778 0.005555556 0.000000000 0.000000000 0.227777778 0.000000000
16  16      0.000000000 0.153333333 0.006666667 0.000000000 0.000000000 0.826666667 0.000000000 0.013333333 0.000000000 0.000000000 0.000000000 0.000000000
17  17      0.295833333 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.404166667 0.004166667 0.000000000 0.000000000 0.000000000 0.295833333
18  18      0.000000000 0.000000000 0.000000000 0.000000000 0.009090909 0.790909091 0.154545455 0.009090909 0.009090909 0.000000000 0.027272727 0.000000000
19  19      0.000000000 0.155555556 0.000000000 0.000000000 0.000000000 0.033333333 0.033333333 0.011111111 0.000000000 0.533333333 0.011111111 0.222222222
20  20      0.055555556 0.000000000 0.533333333 0.000000000 0.000000000 0.000000000 0.177777778 0.005555556 0.000000000 0.000000000 0.227777778 0.000000000

现在,我想知道是否有一种方法可以根据每一列使用top_frac(),这意味着我希望通过每列相同数量的最高概率行收集我的数据的 20%。就像如果整个数据的 20% 是 120,那么我会得到一个矩阵,合并每列的最高 10 个概率。基于单个列很容易做到这一点,但我不知道如何根据每个列按比例进行操作。

【问题讨论】:

  • 当您说 20% 的数据时,您是指 20% 的行还是 20% 的单元格?
  • 您不能以宽格式保存数据,因为包含最高值的 ID 每列会有所不同(从技术上讲,您可以将其显示为具有很多 NA 的宽格式)。相反,您可以使用 tidyr 收集非 id 列,然后使用 top_n。

标签: r matrix dplyr


【解决方案1】:

从上面跟进,它会是这样的:

df %>%
  gather(column, value, -id) %>%
  group_by(id, column) %>%
  top_n(3)

【讨论】:

  • 作为一个很好的指导,最终使用了这个 size &lt;- round((nrow(doc_topic_distr)*.2)/ncol(doc_topic_distr),0) # of docs per topic top_prob_by_topic &lt;- doc_topic_distr %&gt;% magrittr::set_rownames(seq_len(nrow(.))) %&gt;% as_tibble(rownames = "id") %&gt;% pivot_longer(cols = -id, names_to = "Topic", values_to = "Prob") %&gt;% group_by(Topic) %&gt;% top_n(size, Prob) %&gt;% sample_n(size = size, replace = FALSE) %&gt;% arrange(Topic, Prob) 并将它与初始矩阵合并,这样我就不会丢失其他问题。
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 2021-03-18
  • 2020-12-31
  • 2021-10-11
  • 2020-09-22
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
相关资源
最近更新 更多