【问题标题】:Select top n% records from different column groups in a dataframe从数据框中的不同列组中选择前 n% 的记录
【发布时间】:2013-06-13 23:17:06
【问题描述】:

以下是我的示例输入和输出数据的样子。基本上,我希望使用 R 中的应用函数从几组列中选择底部 1 个百分位记录。选择分别基于我的示例数据中 a.1、b.1 和 c.1 列中的最小值。

我已经为 3 个单独的组手动编码,但想知道是否有一种使用 apply、ddply 函数的有效编码方式?

我一直在尝试编写逻辑。任何指针都非常感谢。

> read.csv('in.csv')
  slno a.1 a.2 a.3 b.1 b.2 b.3 c.1 c.2 c.3
1    1  10  34  34  14   1  11   5   2  45
2    2   9  35  35  13   7  17  16   6  46
3    3  12  11  11  12   5  15  13   4  18
4    4  13  13  13  11   6  16  12   8  52
5    5  14   9   9  10   9  19  11   9  36

> read.csv('out.csv')
  a.1 a.2 a.3 b.1 b.2 b.3 c.1 c.2 c.3
1   9  35  35  10   9  19   5   2  45
2  10  34  34  11   6  16  11   9  36

示例代码:

d3.a<- subset(input, a.1 < quantile(a.1, prob = 0.01),
              select=c(a.1, a.2, a.3))
d3.a<-head(arrange(d3.a,desc(a.1)), n=2)              
d3.b<- subset(input, b.1 < quantile(b.1, prob = 0.01),
              select=c(b.1, b.2, b.3))  
d3.b<-head(arrange(d3.b,desc(b.1)), n=2)                  
d3.c<- subset(input, c.1 < quantile(c.1, prob = 0.01),
              select=c(c.1, c.2, c.3))            
d3.c<-head(arrange(d3.c,desc(c.1)), n=2)
out<-cbind(d3.a,d3.b,d3.c)

【问题讨论】:

  • 不应该是a.1 &lt; quantile(...) 来获得最底层的1%吗?
  • 是的,谢谢,进行了编辑。更多的是寻找如何编写应用逻辑的代码。我在我的实际数据集中同时进行前 1% 和后 1% 的操作...
  • 将您的数据重塑为长格式.....

标签: r plyr apply


【解决方案1】:

这会给你一个列表的结果,我建议你这样做,因为变量abc的行数可能不同:

vars <- letters[1:3]  ## change this according to your problem.

L <- lapply(vars, function(x) {
     y <- input[, paste0(x,".1")]
     f <- y < quantile(y, prob=0.01)
     input[f, paste(x, 1:3, sep=".")]
})

如果你真的想要一个数据框,使用这个:

do.call(cbind, L)

【讨论】:

  • 谢谢!我通过执行 head(order(),n=200) 避免了完整数据集中的行数差异问题。基本上从所有相应列组的顶部\底部提取恒定数量的行。
猜你喜欢
  • 2015-03-23
  • 2019-01-23
  • 2021-08-07
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2016-05-06
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多