【问题标题】:How to rank and select rows by row variance in R如何在R中按行方差对行进行排名和选择
【发布时间】:2020-10-04 01:37:09
【问题描述】:

我有一个如下的 R 列表:

         [,1]      [,2]     [,3]     [,4]     [,5]
[1,] 6.939576 0.9102779 2.513760 3.838500 8.017567
[2,] 4.134372 2.1731401 6.627487 6.202576 9.603031
[3,] 6.303585 6.9664992 1.861797 3.507445 1.822297
[4,] 4.675198 4.2120635 6.429899 8.439339 9.593823
[5,] 6.472145 3.2654931 7.416211 2.056762 1.988843
[6,] 7.329604 3.8279722 5.085237 1.158770 1.278410

我想选择 variance 最高的前 3 行,应该是,

         [,1]      [,2]     [,3]     [,4]     [,5]
[1,] 6.939576 0.9102779 2.513760 3.838500 8.017567
[2,] 4.134372 2.1731401 6.627487 6.202576 9.603031
[6,] 7.329604 3.8279722 5.085237 1.158770 1.278410

有人可以帮忙吗?

【问题讨论】:

  • 嗨,你能在你的数据上使用 dput,这种格式很难复制和粘贴
  • 您好@Marting,请在下一个问题中这样做:在控制台中输入dput(dataset)(我假设您的数据名为“数据集”)并复制输出并将其粘贴到问题中。这有助于我们为您提供帮助。

标签: r list data-analysis rank variance


【解决方案1】:

不知道你是如何定义方差的,我假设它可以操作为最小值和最大值之间的差异。

数据:

set.seed(123)
df <- data.frame(
  v1 = rnorm(10),
  v2 = rnorm(10),
  v3 = rnorm(10),
  v4 = rnorm(10)
)

解决方案:

df$variance <- apply(df, 1, function(x) max(x) - min(x))
df[order(df$variance, decreasing = T),]

结果:

            v1         v2         v3          v4  variance
6   1.71506499  1.7869131 -1.6866933  0.68864025 3.4736064
3   1.55870831  0.4007715 -1.0260044  0.89512566 2.5847128
1  -0.56047565  1.2240818 -1.0678237  0.42646422 2.2919055
8  -1.26506123 -1.9666172  0.1533731 -0.06191171 2.1199903
9  -0.68685285  0.7013559 -1.1381369 -0.30596266 1.8394928
10 -0.44566197 -0.4727914  1.2538149 -0.38047100 1.7266063
4   0.07050839  0.1106827 -0.7288912  0.87813349 1.6070247
5   0.12928774 -0.5558411 -0.6250393  0.82158108 1.4466203
2  -0.23017749  0.3598138 -0.2179749 -0.29507148 0.6548853
7   0.46091621  0.4978505  0.8377870  0.55391765 0.3768708

或者,您可以通过计算标准差 sd 来操作方差:

df$variance <- apply(df, 1, sd)

或者干脆使用var:

df$variance <- apply(df, 1, var)

【讨论】:

  • 感谢您的帮助。我的数据也是随机创建的。对于方差,我的意思是通过 var() 计算。不过谢谢你的建议!
  • 已编辑答案。请考虑通过单击答案左上角的勾号来接受它。
【解决方案2】:

嗨,马丁,我假设您可以创建一个 data.frame

library(tidyverse)

original_df <- data.table::fread("6.939576 0.9102779 2.513760 3.838500 8.017567
4.134372 2.1731401 6.627487 6.202576 9.603031
6.303585 6.9664992 1.861797 3.507445 1.822297
4.675198 4.2120635 6.429899 8.439339 9.593823
6.472145 3.2654931 7.416211 2.056762 1.988843
7.329604 3.8279722 5.085237 1.158770 1.278410")


original_df %>%
  rowwise() %>%
  mutate(variance = c_across(everything()) %>% var()) %>%
  ungroup() %>%
  slice_max(n = 3, order_by = variance)
#> # A tibble: 3 x 6
#>      V1    V2    V3    V4    V5 variance
#>   <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>
#> 1  6.94 0.910  2.51  3.84  8.02     8.89
#> 2  4.13 2.17   6.63  6.20  9.60     7.81
#> 3  7.33 3.83   5.09  1.16  1.28     6.86

reprex package (v0.3.0) 于 2020 年 6 月 14 日创建

如果你需要一个真正快速的向量化代码 matrixStats 包有一个向量化方差函数

original_df %>%
  mutate(variance = across(everything()) %>% as.matrix() %>% matrixStats::rowVars(.)) %>% 
  slice_max(n = 3, order_by = variance)

【讨论】:

  • 我只是重新编辑了数据格式,但我不确定它是否是您想要的格式。顺便说一句,你的回答完美地解决了我的问题!非常感谢!
  • 哦,没问题,请考虑投票并接受它作为答案
  • @Bruno 很好的答案,只是一个问题,要读取营销数据,您是否必须复制每一行并粘贴到fread?你知道是否有一种方法可以在不逐行复制数据的情况下读取 OP 数据?
  • @Alexis 我做了复制和粘贴,编辑了括号和数字并在 fread 中使用,如果你愿意,你可以粘贴到 excel 中,然后使用 datapasta 以多种格式将其复制到你的脚本中
  • 是的,这就是为什么我要求 op 更改他发布数据的格式
猜你喜欢
  • 2015-01-31
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多