我对R和数据处理一般都很陌生,所以请原谅我,如果我使用的术语很差。在R中对每个独立变量的值进行数据过滤
我有一些离散的,非唯一的独立变量DeltaT和一个称为Score的相关值的数据。
我想只保留DeltaT中每个值的得分的前5个百分点(删除所有LT 0.95百分点)。
下图描述了我正在努力完成的工作。
我的印象是有办法做到这一点不循环,但不知道我可能需要在函数的名称。
我对R和数据处理一般都很陌生,所以请原谅我,如果我使用的术语很差。在R中对每个独立变量的值进行数据过滤
我有一些离散的,非唯一的独立变量DeltaT和一个称为Score的相关值的数据。
我想只保留DeltaT中每个值的得分的前5个百分点(删除所有LT 0.95百分点)。
下图描述了我正在努力完成的工作。
我的印象是有办法做到这一点不循环,但不知道我可能需要在函数的名称。
下面是使用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
这个答案和@Gopala提供的答案工作。此解决方案是首选,因为它只使用本机数据类型和函数解决了我的问题。谢谢! –
没有你的数据,我创建了我自己的。这里有一个方法,可以使用点函数来获得第95百分位值,并使用dplyr
包的分组和过滤功能帮助您解决方案:
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))
输出在这种情况下会因为只有这两个分数匹配第95百分位或以上:
Source: local data frame [2 x 2]
Groups: DeltaT [2]
DeltaT Score
<dbl> <int>
1 1 10
2 2 10
您可以根据您的具体需要更改代码(如果有的话)。
试试这个:
library(data.table)
setDT(df) # convert your dataset into a data.table
output <- df[ score > quantile(df$score, c(.95)), # filter condition
.(score=score), # output column
by=.(DeltaT) ] # grouped by
dplyr可以是非常有帮助的。 假设 “DF2” 是你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
你可以使用R数据框对象的'dput'发布数据吗?很难从图像中导入数据。 – Gopala