Как я могу фильтровать на основе 2 условий - PullRequest
0 голосов
/ 04 октября 2019

Я не могу отфильтровать по 2 условию. as1 - это фрейм данных

as1
                   da cat
1 2016-06-04 04:05:45   A
2 2016-06-04 04:05:46   B
3 2016-06-04 04:05:45   C
4 2016-06-04 04:05:46   D

as2 <- as1 %>% filter(as.POSIXct("2016-06-04 04:05:45") && cat == "A")

Мне нужно ниже фрейма данных

as2
                   da cat
1 2016-06-04 04:05:45   A

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Вы были почти там Это возможное решение для вас. Вам нужно было отформатировать данные, используя lubridate перед фильтрацией данных.

# load library
library(dplyr)

# create data
x = data.frame(da = c("2019-10-04 07:05:02","2019-10-04 07:05:03","2019-10-04 07:05:02","2019-10-04 07:05:03","2019-10-04 07:05:04"), 
               db = c("a","a","c","a","a"), stringsAsFactors = F)

# convert to date time format
x$da = lubridate::ymd_hms(x$da)

# see the structure of data
str(x)

# filter the data
x %>% filter(da <= lubridate::ymd_hms('2019-10-04 07:05:02') & db == 'a' )

#                   da db
#1 2019-10-04 07:05:02  a

Ваши данные

# Data
x = structure(list(da = structure(c(1464993345, 1464993346, 1464993345, 1464993346), class = c("POSIXct", "POSIXt"), tzone = ""), cat = structure(1:4, .Label = c("A", "B", "C", "D"), class = "factor")), class = "data.frame", row.names = c(NA, -4L))

# convert to date time format
x$da = lubridate::ymd_hms(x$da)

# see the structure of data
str(x)

# filter the data
x %>% filter(da <= lubridate::ymd_hms('2016-06-03 15:35:45') & cat == 'A' )

#                   da cat
#1 2016-06-03 15:35:45   A
0 голосов
/ 04 октября 2019

Давайте создадим некоторые воспроизводимые данные, так как ваш вопрос их пропускает:

as1 <- read.csv(header = T, text = "
da, cat
2016-06-04 04:05:45,A
2016-06-04 04:05:46,B
2016-06-04 04:05:45,C
2016-06-04 04:05:46,D", stringsAsFactors = FALSE)

Теперь первое, что вы хотите проверить, это то, является ли столбец "da" на самом деле POSIXct.

class(as1$da)
#> [1] "character"

В моем примере это не так, поэтому я добавляю дополнительную строку к трубе dplyr.

library(dplyr)

as2 <- as1 %>% 
  mutate(da = as.POSIXct(da)) %>% # add only if column isn't POSIXct
  filter(da == as.POSIXct("2016-06-04 04:05:45") & cat == "A")

В основном то, что вы сделали неправильно, оставило as.POSIXct("2016-06-04 04:05:45") в качестве выражения. filter оценивает условие, то есть оно сохраняет только те строки, где что-то равно TRUE. Следовательно, для «2016-06-04 04:05:45» вам нужен тест --- da == as.POSIXct("2016-06-04 04:05:45").

Почему вам нужно & здесь, а не &&, см. thisответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...