如何从R中的列表中过滤唯一值

时间:2019-06-03 18:51:03

标签: r list filter

我想提取列表中特定等级的排放(Disch)值。该列表包括每个月的日期,月份,时间和等级。每个月的行数不均匀。如果我要对Rank = 1列表中的每个月的排放值进行过滤,那该怎么办?同样在原始数据集中,我具有重复的等级及其对应的排放值,对于给定的等级,我该如何过滤每个月的排放值?

S <- split(Sampledata3, Sampledata3$Months) #Split the original data into different months. 
This is how my list looks like: 
> S
$`1`
         Date Months Disch Rank
4  1943-01-01      1   255    1
5  1945-01-14      1   450    2
10 1962-01-18      1  1204    4
12 1972-01-15      1   635    3
16 1989-01-20      1  1204    4

$`3`
         Date Months Disch Rank
6  1945-03-14      3   215    1
17 1992-03-29      3   450    2

$`4`
         Date Months Disch Rank
8  1960-04-23      4   120    1
14 1981-04-11      4   154    2

$`5`
        Date Months Disch Rank
7 1954-05-04      5   360    2
9 1960-05-09      5   145    1

$`6`
         Date Months Disch Rank
3  1967-06-16      6   400    2
15 1986-06-20      6   154    1

$`8`
         Date Months Disch Rank
13 1977-08-15      8  1456    1

$`10`
        Date Months Disch Rank
1 1938-10-01     10  1000    1
2 1954-10-27     10  1200    2

$`12`
         Date Months Disch Rank
11 1968-12-19     12   752    1

Sample data:
> Date<- as.Date(c('1938-10-01','1954-10-27', '1967-06-16','1943-01-01','1945-01-14','1945-03-14','1954-05-04','1960-04-23','1960-05-09','1962-01-18','1968-12-19','1972-01-15','1977-08-15','1981-04-11','1986-06-20','1989-01-20','1992-03-29'))
> Months<- c('Oct','Oct','Jun','Jan','Jan','Mar','May','Apr','May','Jan','Dec','Jan','Aug','Apr','Jun','Jan','Mar')
> Dis<-c('1000','1200','400','255','450','215','360','120','145','1204','752','635','1456','154','154','1204','450')
> Sampledata<-data.frame("Date"=Date,"Months"=Months,"Disch"=Dis)

2 个答案:

答案 0 :(得分:1)

或使用基数R tapplyaggregate,两者都可以将函数应用于数据组,并以不同的默认格式返回每个组的答案

#also recommend that you set stringsAsFactors=FALSE when you initialize data.frame as sample dataset
Sampledata <- data.frame(Date=Date,Months=Months,Disch=Dis, stringsAsFactors = FALSE)
Sampledata$Disch <- as.numeric(Sampledata$Disch) #convert to numeric class
tapply(X=Sampledata$Disch, INDEX=Sampledata$Months, FUN=max)
#Apr  Aug  Dec  Jan  Jun  Mar  May  Oct 
#154 1456  752 1204  400  450  360 1200

aggregate(Disch ~ Months, data = Sampledata, FUN=max)
#   Months Disch
#1    Apr   154
#2    Aug  1456
#3    Dec   752
#4    Jan  1204
#5    Jun   400
#6    Mar   450
#7    May   360
#8    Oct  1200

答案 1 :(得分:0)

具有list的选项是(如果OP已经具有现有的list

library(tidyverse)
map(S, ~ .x %>%
           filter(Rank == 1))

如果有重复的“排名”,请使用

删除重复的
map(S, ~ .x %>%
              filter(Rank == 1, !duplicated(Rank))

或将slicewhich一起使用

map(S, ~ .x %>%
             slice(which(Rank == 1)[1])