2016-05-13 61 views
0

我对R和数据处理一般都很陌生,所以请原谅我,如果我使用的术语很差。在R中对每个独立变量的值进行数据过滤

我有一些离散的,非唯一的独立变量DeltaT和一个称为Score的相关值的数据。

我想只保留DeltaT中每个值的得分的前5个百分点(删除所有LT 0.95百分点)。

下图描述了我正在努力完成的工作。

Example in Excel

我的印象是有办法做到这一点不循环,但不知道我可能需要在函数的名称。

+0

你可以使用R数据框对象的'dput'发布数据吗?很难从图像中导入数据。 – Gopala

回答

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 
+1

这个答案和@Gopala提供的答案工作。此解决方案是首选,因为它只使用本机数据类型和函数解决了我的问题。谢谢! –

1

没有你的数据,我创建了我自己的。这里有一个方法,可以使用点函数来获得第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 

您可以根据您的具体需要更改代码(如果有的话)。

0

试试这个:

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 
0

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 
+0

这给你第95百分点的分数。不是具有该分数或以上的行。请参阅下面的答案。 – Gopala

+0

是的,你是对的。它需要筛选,然后 – sachinv

+0

正确,但为什么张贴另一个答案是相同的解决方案,如下所示。 – Gopala

相关问题