根据多个变量过滤数据

时间:2018-10-16 18:34:46

标签: r date if-statement group-by

我正在尝试根据其他列条件创建一个新列,其中的数据如下所示:

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"

对于每个ID,只要第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 :(得分:3)

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

答案 1 :(得分:1)

    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)

此功能将为您提供帮助。 但是,每一列的约束条件都是不变的。 您可以根据需要进行更改。

谢谢