我想提取列表中特定等级的排放(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)
答案 0 :(得分:1)
或使用基数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
答案 1 :(得分:0)
具有list
的选项是(如果OP已经具有现有的list
)
library(tidyverse)
map(S, ~ .x %>%
filter(Rank == 1))
如果有重复的“排名”,请使用
删除重复的map(S, ~ .x %>%
filter(Rank == 1, !duplicated(Rank))
或将slice
与which
一起使用
map(S, ~ .x %>%
slice(which(Rank == 1)[1])