【问题标题】:How to select the most distant values from the mean of a vector如何从向量的平均值中选择最远的值
【发布时间】:2018-01-24 23:51:27
【问题描述】:

假设向量

vector<-c( 0.096846906,  0.068149926, -0.019938431, -0.095515090, -0.109936195, -0.006755265, -0.207243555,  0.117235435, -0.036333873, -0.156043650, -0.334150484,
   0.141990040, -0.116270635,  0.079373531,  0.070359814,  0.090415147,  0.046807444, -0.024908308,  0.022005548,  0.015559027,  0.065343488,  0.039524657,
   0.077209216,  0.051124695,  0.076794957, -0.059121977,  0.071967601,  0.042357348,  0.039801927,  0.053932640, -0.036346802, -0.070258993, -0.105611663,
   -0.138738161, -0.044395825, -0.194363631, -0.127153662,  0.052912436,  0.163879916,  0.087960810,  0.005298789, -0.191104683,  0.113214756,  0.045232380)

mean=-0.007702101。我想选择离平均值最远的值。例如,假设距离平均值最远的 10 个值。

我使用这段代码来获取离平均值最远的值:

sort(abs(vector-mean(vector)))

所以基本上现在我有一系列有序的差异。但是我找不到一种方法来获取距离最高的值(来自名为:vector 的数据)(同样是最远的 10 个)。我确信这很简单,但我真的被困住了!

【问题讨论】:

  • 你的意思是vector[which.max(abs(vector - mean(vector)))]
  • 是的!但不要只选择一个...选择 10 个最极端的(或者如果可能的话)。甚至是最极端的 20 个等。 *我应该编辑问题以使其清楚!
  • 很多方法...也许vector[head(order(abs(vector - mean(vector)), decreasing = TRUE), 10)]
  • 是的!抱歉回复晚了!!!

标签: r distance mean


【解决方案1】:

有很多方法可以做到这一点。根据您的示例和要求,您可以这样做,

m <- 10
vector[head(order(abs(vector - mean(vector)), decreasing = TRUE), m)]
#[1] -0.3341505 -0.2072436 -0.1943636 -0.1911047  0.1638799  0.1419900 -0.1560437 -0.1387382  0.1172354  0.1132148

翻译为:

  • 取每个值与平均值之差的绝对值
  • 顺序递减(从最大值开始)。订单给出索引而不是实际值(就像sort 所做的那样)
  • 使用head 获取第一个m 值。另一种方法是[1:m]
  • 将索引包装在向量中以获得实际的vector

【讨论】:

  • abs 之前加上- 可以去掉decreasing = TRUE
  • 如果有人将它用于数据集,这也可以扩展:apply(data,2,function(x) x[head(order(abs(x - mean(x)), decreasing = TRUE), m)])
  • @HerculesApergis 当然。但是,如果您有一个数据框,请尽量避免使用apply(df, 2, ...)),因为它会强制转换为矩阵,从而降低效率。通常sapplylapply 会完成这项工作
【解决方案2】:

你可以使用 dplyr:

vector%>%as_tibble()%>%mutate(dist_Mean = abs(value - mean(value) ))%>%arrange(desc(dist_Mean))%>%top_n(10)

【讨论】:

  • 非常有趣的dplyr案例!
【解决方案3】:

另一种方法是基于可调整的标准偏差

假设mn &lt;- mean(vector)std &lt;- sd(vector),那么

d <- 1.5
vector[vector<(mn-d*std) | vector>(mn+d*std)]

#[1] -0.2072436 -0.3341505 -0.1943636  0.1638799 -0.1911047

通过调整d,您可以决定与平均值相差多远。

d=1 为您提供与平均值相差 1 个标准差的数字)

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 2020-01-03
    • 2022-01-18
    • 1970-01-01
    • 2014-08-20
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多