我对R和数据处理一般都很陌生,所以如果我对术语的使用很差,请原谅我。
我有一些数据带有离散的,非唯一的自变量DeltaT和一个称为Score的依赖值。
我想保留DeltaT中每个值的前5个百分位数(删除所有LT 0.95百分位数)。
下图描绘了我想要完成的任务。
我的印象是,如果没有循环,有办法做到这一点,但不知道我可能需要的功能的名称。
答案 0 :(得分:1)
没有您的数据,我创建了自己的数据。这是一种方法,可以帮助您使用分位数函数获得第95百分位值并使用 List<String> list = new LinkedList<String>();
Set<String> set = new LinkedHashSet<String>();
list.add("B"); list.add("A"); list.add("A"); list.add("R");
list.add("C");list.add("A");list.add("C");list.add("R");
for (String string : list) {
if (Collections.frequency(list, string) > 1) {
set.add(string);
}
}
for (String string : set) {
list.remove(string);
}
System.out.println(list);
包的分组和过滤功能的解决方案:
dplyr
在这种情况下的输出将仅为这两个分数与第95百分位或以上匹配:
library(dplyr)
df <- data.frame(DeltaT = c(rep(1, 10), rep(2, 10)), Score = c(1:10, 1:10))
df %>% group_by(DeltaT) %>% filter(Score >= quantile(Score, probs = 0.95))
您可以更改符合您特定需求的代码。
答案 1 :(得分:1)
以下是使用quantile()
,ave()
,比较和编制索引的基本R解决方案:
df <- data.frame(DeltaT=c(1L,1L,1L,2L,2L,3L,3L,3L,3L,4L,4L,4L),Score=1:12);
df[df$Score>=ave(df$Score,df$DeltaT,FUN=function(x) quantile(x,0.95)),];
## DeltaT Score
## 3 1 3
## 5 2 5
## 9 3 9
## 12 4 12
您的示例数据并不理想,因为它不包括满足过滤条件的多个Score
值的情况。我在假设您要保留满足条件的所有行的情况下编写了我的解决方案。这是一个更好的测试:
df <- data.frame(DeltaT=c(1L,1L,1L,2L,2L,3L,3L,3L,3L,4L,4L,4L,4L),Score=c(1:12,12));
df[df$Score>=ave(df$Score,df$DeltaT,FUN=function(x) quantile(x,0.95)),];
## DeltaT Score
## 3 1 3
## 5 2 5
## 9 3 9
## 12 4 12
## 13 4 12
答案 2 :(得分:0)
试试这个:
Source: local data frame [2 x 2]
Groups: DeltaT [2]
DeltaT Score
<dbl> <int>
1 1 10
2 2 10
答案 3 :(得分:0)
dplyr 非常有帮助。 假设&#34; df2&#34;是你的data.frame
> library(dplyr)
> group_by(df2, DeltaT) %>% summarise(Score = round(quantile(Score, probs=0.95),0))
Source: local data frame [4 x 2]
DeltaT Score
(dbl) (dbl)
1 1 3
2 2 5
3 3 9
4 4 12