如何从三个不同列中选择10个最大值并将它们保存在R中的新数据框中?

时间:2016-02-03 18:22:50

标签: r

Var1 <- 90:115
Var2 <- 1:26
Var3 <- 52:27

data <- data.frame(Var1, Var2, Var3)

嗨,我想从每列中选择10个最大值并将它们保存在新数据框中?我知道在我的示例中,新数据框将包含20行,但我不理解正确的工作流程。

这就是我所期待的:

Var1 Var2 Var3
90    1    52
91    2    51
92    3    50
93    4    49
94    5    48
95    6    47
96    7    46
97    8    45
98    9    44
99    10   43
106   17   36
107   18   35
108   19   34
109   20   33
110   21   32
111   22   31
112   23   30
113   24   29
114   25   28
115   26   27

我可以用这种方法解决我的三栏问题

df <- subset(data, Var1 >=106 | Var2 >=17 | Var3 >=43)

但如果我必须为50多个列做到这一点,那么它并不是最好的解决方案。

4 个答案:

答案 0 :(得分:3)

这可以通过使用lapplysort对其进行循环来完成,并使用head获取前10个值

 data.frame(lapply(data, function(x) head(sort(x, 
                           decreasing=TRUE) ,10)))

如果我们需要前10行,只需使用

 head(data, 10)

更新

基于OP的编辑

data[sort(Reduce(union,lapply(data, function(x) 
                  order(x,decreasing=TRUE)[1:10]))),]

答案 1 :(得分:2)

我认为这就是你想要的:

data[sort(unique(c(sapply(data,order,decreasing=T)[1:10,]))),]

基本索引每列的前10个元素,合并它们并删除重复,重新排序并从原始数据中提取它。

答案 2 :(得分:1)

直接回答您的问题:

<script>
    myUrl = window.opener.catUrl;
    alert(myUrl)
    id=1;
    firstTime=true;
    ArticlesBlock(); 
</script>

但你为什么要做这样的事呢?你打破了数据的顺序--Var3正在增加,其他正在减少。也许你想要一个列表,而不是数据框?

答案 3 :(得分:1)

这可能会有所帮助:

thresh <- sapply(data,sort,decreasing=T)[10,]
data[!!rowSums(sapply(1:ncol(data),function(x) data[,x]>=thresh[x])),]

首先,定义向量thresh,其中包含每列的第十大值。然后我们对列执行循环以检查是否有任何值大于或等于相应的阈值。 !!as.logical()的简写符号,其(由于与rowSums的组合)选择其中至少一个值高于或等于阈值的那些行。在您的示例中,这会产生输出:

#   Var1 Var2 Var3
#1    90    1   52
#2    91    2   51
#3    92    3   50
#4    93    4   49
#5    94    5   48
#6    95    6   47
#7    96    7   46
#8    97    8   45
#9    98    9   44
#10   99   10   43
#17  106   17   36
#18  107   18   35
#19  108   19   34
#20  109   20   33
#21  110   21   32
#22  111   22   31
#23  112   23   30
#24  113   24   29
#25  114   25   28
#26  115   26   27

这等于您使用所发布命令获得的输出:

#> identical(data[!!rowSums(sapply(1:ncol(data),function(x) data[,x]>=thresh[x])),], subset(data, Var1 >=106 | Var2 >=17 | Var3 >=43))
[1] TRUE