Фильтрация данных по нескольким переменным - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь создать новый столбец на основе других критериев столбца, где мои данные выглядят следующим образом:

ID   Column 1    Column 2    Column 3 
 1     2            Y       "2013-10-22T10:09"
 1     2            Y       "2013-10-23T10:09" 
 2     3            N       "2013-10-23T10:09"
 3     0            Y       "2013-10-23T10:09"

Для каждого идентификатора я бы хотел сохранить только самую раннюю дату / время, покастолбец 1 больше 0 и столбец 2 не равен N. Результаты будут выглядеть следующим образом:

 ID   Column 1    Column 2    Column 3             Column 4
  1     2            Y       "2013-10-22T10:09"    2013-10-22

В настоящее время я пробовал это, но мне было интересно, как это сделать и есть ли элегантный способ сделатьэто:

library(dplyr)
ifelse(Column 1 >0 and Column 2 !="N",  
(new %>%
group_by(ID) %>%
arrange(Column 3) %>%
slice(1L)))
Column 4 <- as.Date(Column 3, format='%Y-%m-%dT%H:%M')

Ответы [ 2 ]

0 голосов
/ 17 октября 2018
    rm(list = ls())
    df <- data.frame(id = c(1,1,2,3),column_1 = c(2,2,3,0),
          column_2 = c("Y","Y","N","Y"), 
          column_3 = as.Date(c("2013-10-22","2013-10-23","2013-10-23","2013-10-23"),format = "%Y-%m-%d"))
n <- unique(df$id)
datalist <- list()
for(i in 1:n)
{
  z <- df[df$id == i & df$column_1 > 0 & df$column_2 != "N" & df$column_3 == min(df$column_3),]
  datalist[[i]] <- z
}
do.call(rbind,datalist)

Эта функция поможет вам.Но ограничения для каждого столбца были сделаны постоянными.Вы можете изменить его согласно вашему удобству.

Спасибо

0 голосов
/ 16 октября 2018
library(dplyr)

df %>% 
  filter(Column1 > 0 & Column2 != 'N') %>% # filter out non-matching rows
  group_by(ID) %>% 
  top_n(-1, Column3) %>% # select only the row with the earliest date-time
  mutate(Date = as.Date(Column3)) # create date column

# 
# # A tibble: 1 x 5
# # Groups:   ID [1]
#      ID Column1 Column2 Column3          Date      
#   <int>   <int> <chr>   <chr>            <date>    
# 1     1       2 Y       2013-10-22T10:09 2013-10-22
...