R Функция для определения первого положительного наблюдения по году - PullRequest
0 голосов
/ 29 ноября 2018

Мне нужно написать функцию в R, которая будет возвращать первую дату в серии, для которой значение столбца больше 0. Я хотел бы указать эту дату для каждого года в кадре данных.

Например, учитывая данные этого примера ...

Date         Year     Catch

3/12/2001    2001     0
3/19/2001    2001     7
3/24/2001    2001     9
4/6/2002     2002     12 
4/9/2002     2002     0
4/15/2002    2002     5
4/27/2002    2002     0
3/18/2003    2003     0
3/22/2003    2003     0
3/27/2003    2003     15

Я бы хотел, чтобы R возвращал первую дату для каждого года с уловом> 0

Year    Date 

2001    3/19/2001
2002    4/6/2002
2003    3/27/2003

, с которым я работалфункция min ниже, но она возвращает только номер строки, и мне не удалось вернуть значение для каждого года в кадре данных.min(which(data$Catch > 0))

Я новичок в написании своих собственных функций на R. Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 5 ]

0 голосов
/ 29 ноября 2018
library(dplyr)

df1 %>% 
  group_by(Year) %>% 
  slice(which.max(Catch > 0))

# # A tibble: 3 x 3
# # Groups:   Year [3]
#   Date        Year Catch
#   <date>     <int> <int>
# 1 2001-03-19  2001     7
# 2 2002-04-06  2002    12
# 3 2003-03-27  2003    15

Данные:

df1 <-
structure(list(Date = structure(c(11393, 11400, 11405, 11783, 
11786, 11792, 11804, 12129, 12133, 12138), class = "Date"), Year = c(2001L, 
2001L, 2001L, 2002L, 2002L, 2002L, 2002L, 2003L, 2003L, 2003L
), Catch = c(0L, 7L, 9L, 12L, 0L, 5L, 0L, 0L, 0L, 15L)), .Names = c("Date", 
"Year", "Catch"), row.names = c(NA, -10L), class = "data.frame")
0 голосов
/ 29 ноября 2018
df <- data.frame(Date = as.Date(c("3/12/2001", "3/19/2001", "3/24/2001",
                      "4/6/2002", "4/9/2002", "4/15/2002", "4/27/2002",
                      "3/18/2003", "3/22/2003", "3/27/2003"), "%m/%d/%Y"),
             Year = c(2001, 2001, 2001, 2002, 2002, 2002, 2002, 2003, 2003, 2003),
             Catch = c(0, 7, 9, 12, 0, 5, 0, 0, 0, 15))

Если вам не нужна функция, вы можете попробовать

library(dplyr)
df %>% group_by(Date) %>% filter(Catch > 0 ) %>% group_by(Year) %>% summarize(date = min(Date))

Если вы точно хотите написать функцию, возможно,

firstcatch <- function(yr) {
  dd <- subset(df, yr == Year)
  withcatches <- dd[which(dd$Catch > 0), ]
  min(as.character(withcatches$Date))
} 

yrs <- c(2001, 2002, 2003)
dates <- unlist(lapply(yrs, firstcatch))

ndt <- data.frame(Year = yrs, Date = dates)
0 голосов
/ 29 ноября 2018

Вот решение dplyr.

df1 %>%
  group_by(Year) %>%
  mutate(Inx = first(which(Catch > 0))) %>%
  filter(Inx == row_number()) %>%
  select(-Inx)
## A tibble: 3 x 3
## Groups:   Year [3]
#  Date        Year Catch
#  <date>     <int> <int>
#1 2001-03-19  2001     7
#2 2002-04-06  2002    12
#3 2003-03-27  2003    15

Данные.

df1 <- read.table(text = "
Date         Year     Catch
3/12/2001    2001     0
3/19/2001    2001     7
3/24/2001    2001     9
4/6/2002     2002     12 
4/9/2002     2002     0
4/15/2002    2002     5
4/27/2002    2002     0
3/18/2003    2003     0
3/22/2003    2003     0
3/27/2003    2003     15                  
", header = TRUE)

df1$Date <- as.Date(df1$Date, "%m/%d/%Y")
0 голосов
/ 29 ноября 2018

Вот опция с data.table

library(data.table)
setDT(df1)[, .SD[which.max(Catch > 0)], Year]
#   Year       Date Catch
#1: 2001 2001-03-19     7
#2: 2002 2002-04-06    12
#3: 2003 2003-03-27    15

data

df1 <- structure(list(Date = structure(c(11393, 11400, 11405, 11783, 
11786, 11792, 11804, 12129, 12133, 12138), class = "Date"), Year = c(2001L, 
2001L, 2001L, 2002L, 2002L, 2002L, 2002L, 2003L, 2003L, 2003L
 ), Catch = c(0L, 7L, 9L, 12L, 0L, 5L, 0L, 0L, 0L, 15L)), row.names = c(NA, 
 -10L), class = "data.frame")
0 голосов
/ 29 ноября 2018

Вы можете попробовать что-то вроде этого:

df <- data %>% 
  group_by(Year) %>%
  mutate(newCol=Date[Catch>0][1]) %>%
  distinct(Year, newCol)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...