从数据框的不同列组中选择前n%的记录

3
以下是我的样本输入和输出数据的示例。基本上,我想使用R中的apply函数从多个列组中选择底部1%的记录。选择基于我的示例数据中a.1、b.1和c.1列的最小值。
我已经手动编码了三个单独的组,但是想知道是否有一种有效的方法可以通过使用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)

1
应该是 a.1 < quantile(...) 才能得到底部 1% 吗? - flodel
是的,谢谢您,我已经进行了编辑。我更想知道如何编写应用逻辑。在我的实际数据集中,我正在处理前1%和后1%。 - Abi K
1
将您的数据重塑为长格式...... - mnel
1个回答

2
这将会以列表形式呈现结果,我建议您这样做,因为变量a、b、c的行数可能不同:
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)来避免了完整数据集中行数差异的问题。基本上,从所有相应的列组中从顶部\底部提取了一定数量的行。 - Abi K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接