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多个列做到这一点,那么它并不是最好的解决方案。
答案 0 :(得分:3)
这可以通过使用lapply
,sort
对其进行循环来完成,并使用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