Как отфильтровать уникальное значение из списка в R - PullRequest
1 голос
/ 03 июня 2019

Я хочу извлечь значения разряда (Disch) для определенного ранга в списке.Список состоит из Даты, Месяца, Диска и Ранга для каждого месяца.В каждом месяце количество строк неравномерно.Если бы мне нужно было отфильтровать значения выписок за каждый месяц в списке для ранга = 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 ]

1 голос
/ 03 июня 2019

или используйте базу R tapply или aggregate, оба из которых могут применять функцию к группам ваших данных и возвращать ответ для каждой группы, но в разных формах по умолчанию

#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
0 голосов
/ 03 июня 2019

Опцией с list будет (в случае, если у ОП уже есть list)

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

Если есть дубликат 'Rank', удалите дубликат с помощью

map(S, ~ .x %>%
              filter(Rank == 1, !duplicated(Rank))

Или используя slice с which

map(S, ~ .x %>%
             slice(which(Rank == 1)[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...