【问题标题】:How to select the top and low 10% values of a data.frame in R?如何在 R 中选择 data.frame 的最高和最低 10% 值?
【发布时间】:2020-12-31 10:51:49
【问题描述】:

问题已更新:

我有DF data.frametwo variables。我想将DF 数据的high 10%low 10% 保存在不同的data.frame 中。下面是我的示例数据集,具有所需的输出。感谢任何 cmets/建议。

library(tidyverse)

DF <- data.frame(D1 = 1:30, D2 = 36:65)

期望的输出:

 DF_High  <- data.frame(D1 = c(30,29,28), D2 = c(65,64,63))
 DF_Low  <- data.frame(D1 = c(1,2,3), D2 = c(36,37,38))

【问题讨论】:

  • 您有两个变量,您想使用哪个变量来提取顶部行?或者你想要的是head(DF,0.10*(nrow(DF)))tail(DF,0.10*(nrow(DF)))
  • 我试过head(DF,0.10*(nrow(DF))),它不会同时对两个变量进行排序。我期待sort D1D2Descending 中为10% High 然后ascending10% Low
  • 我已经为您的问题添加了可能的解决方案代码。如果我理解正确,您想订购两次然后提取。
  • 我认为你的问题不清楚而且有点混乱。您能否创建一个包含 10/20 行的简短示例并显示其预期输出?这将大有帮助。
  • @RonakShah 感谢并为造成的混乱感到抱歉。查看编辑 - 希望现在很清楚。

标签: r dataframe sorting tidyverse


【解决方案1】:

尝试这种方法,根据您想订购两次然后提取的 cmets。这里的代码使用你的数据DF

#Code for high
DF2 <- DF[order(-DF$D1,-DF$D2),]
#Code for low
DF3 <- DF[order(DF$D1,DF$D2),]
#Extract
DFHigh <- head(DF2,0.10*nrow(DF2))
DFLow <- head(DF3,0.10*nrow(DF3))

更新:这里是重塑数据的解决方案:

library(tidyverse)
set.seed(123)
#Data
DF <- data.frame(D1 = runif(500,1,50), D2 = runif(100, 5,60))
#Code
Melted <- DF %>% pivot_longer(everything()) %>%
  arrange(name,desc(value)) %>% group_by(name) %>%
  mutate(id=1:n()) %>%
  pivot_wider(names_from = name,values_from=value)
#Choose high
dfhigh <- head(Melted,0.10*nrow(Melted))
dflow <- tail(Melted,0.10*nrow(Melted))

【讨论】:

  • 谢谢@Duck,当我使用DF2 &lt;- DF[order(-DF$D1,-DF$D2),] 时,我认为data.frame (DF) 会按降序(从高到低)排序,但是,似乎只有column 1 (D1) 被排序。这是我用来检查head(DF,5)的快速方法
  • @Hydro 我添加了更新。请检查,我认为您想对每个变量进行排序,然后提取前 10% 和低 10%。检查最后一个代码。
  • 很抱歉给您带来了困惑。我用所需的输出更新了问题 - 看看。
【解决方案2】:

我们可以使用across 从每列中获取前 10% 的值。

library(dplyr)

n <- 0.1 * nrow(DF)
Dfhigh <- DF %>%summarise(across(.fns = ~sort(.x, decreasing = TRUE)[1:n]))
Dflow <- DF %>%summarise(across(.fns = ~sort(.x)[1:n]))

在基础 R 中,我们可以这样做:

Dfhigh <- sapply(DF, function(x) sort(x, decreasing = TRUE)[1:n])
Dflow <- sapply(DF, function(x) sort(x)[1:n])

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2016-08-16
    • 2021-02-23
    • 1970-01-01
    • 2021-08-22
    • 2017-04-13
    • 2016-05-02
    • 2019-08-21
    相关资源
    最近更新 更多