R 中自变量的每个值过滤数据
Filter Data Per Value of Independent Variable in R
我对 R 和一般的数据处理还很陌生,所以如果我的术语使用不当,请原谅我。
我有一些数据具有离散的、非唯一的独立变量 DeltaT 和一个名为 Score 的相关值。
我只想保留 DeltaT 中每个值的分数的前 5 个百分位数(删除所有 LT 0.95 个百分位数)。
下图描述了我正在努力完成的事情。
我的印象是有一些方法可以不使用循环来执行此操作,但不知道我可能需要的函数的名称。
没有你的数据,我创建了自己的数据。这是一种可以帮助您使用分位数函数获取第 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
这是使用 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
我对 R 和一般的数据处理还很陌生,所以如果我的术语使用不当,请原谅我。
我有一些数据具有离散的、非唯一的独立变量 DeltaT 和一个名为 Score 的相关值。
我只想保留 DeltaT 中每个值的分数的前 5 个百分位数(删除所有 LT 0.95 个百分位数)。
下图描述了我正在努力完成的事情。
我的印象是有一些方法可以不使用循环来执行此操作,但不知道我可能需要的函数的名称。
没有你的数据,我创建了自己的数据。这是一种可以帮助您使用分位数函数获取第 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
这是使用 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