Это, наверное, действительно просто. В первом случае, используя президентские данные, я могу фильтровать по годам или годам 2. И я получаю тот же результат.
Однако, когда я использую данные posixct и пытаюсь фильтровать аналогичным образом, я сталкиваюсь спроблемы.
Когда я пишу
school_hours2<-as.character(c(07:18))
, я вижу значения в school_hours 2 "7", "8", "9" и т. д., тогда как в school_hours они равны "07" "08 "" 09 "и т. Д.
РЕДАКТИРОВАТЬ: Я думаю, что это объясняет эту разницу тогда? РЕДАКТИРОВАТЬ: я вижу проблему сравнения целое число: символ, и даже когда я пишу вектор as.character значения в векторе не соответствуют тому, что я хочу.
Я хотел бы иметь возможностьфильтр по school_hours2. Поскольку это означало бы, что я мог подумать «я хотел бы отфильтровать эти два раза» и установить верхнюю и нижнюю границы. Вместо того, чтобы писать все интервальные точки между ними. Как мне это получить?
Почему фильтрация по "Y" проще, чем фильтрация по "H"?
library (tidyverse)
#some data - filtering works
data(presidential)
head(presidential)
str(presidential)
presidential%>%filter(format(as.Date(start),"%Y")<=2005)
years<-c('1979', '1980', '1981', '1982',
'1983', '1984', '1985', '1986',
'1987', '1988', '1989', '1990'
)
years2<-c(1950:1990)
presidential%>%filter(format(as.Date(start),"%Y")%in% years2)
presidential%>%filter(format(as.Date(start),"%Y")%in% years)
#some date time data - filtering.
test_data<-sample(seq(as.POSIXct('2013/01/01'), as.POSIXct('2017/05/01'), by="day"), 1000)
td<-as.data.frame(test_data)%>%mutate(id = row_number())
school_hours<-c('07', '08', '09', '10',
'11', '12', '13', '14',
'15', '16', '17', '18'
)
school_hours2<-c(07:18)
school_years<-c(2015,2016,2017)
school_years2<-c(2015:2017)
str(td)
test1<-td%>%
filter(id >=79)
schools<-td%>%
filter(format(test_data,'%H') %in% school_hours)
schools2<-td%>%
filter(format(test_data,'%H') %in% school_hours2)
schools3<-td%>%
filter(format(test_data,'%Y')==2017)
schools4<-td%>%
filter(format(test_data,'%Y') %in% school_years)
schools5<-td%>%
filter(format(test_data,'%Y') %in% school_years2)
Вот мой вопрос: в коде выше, когда я пытаюсь фильтровать td (который содержит данные posixct) используя school_hours или school_hours2 я получаю ноль возвращаемых данных. Почему?
То, что я хотел бы сделать, это вместо того, чтобы писать
school_hours<-c('07', '08', '09', '10',
'11', '12', '13', '14',
'15', '16', '17', '18'
)
Я бы написал
school_hours2<-c(07:18)
Так же, как у меня для school_yearsи фильтрация будет работать. Это не работает
schools2<-td%>%
filter(format(test_data,'%H') %in% school_hours2)
Это работает
schools5<-td%>%
filter(format(test_data,'%Y') %in% school_years2)
ПОЧЕМУ?
Я спрашиваю, потому что: я использовал нечто подобное для фильтрации своих реальных данных,которым я не могу поделиться, и я получаю несоответствие.
Когда я использую school_hours (который является символом), я генерирую 993 записи, и в первый раз это 07:00. Когда я использую school_hours2 (который является целым числом), я генерирую 895 записей, и первый раз - 10:00. Я знаю - «без данных мы не можем ничего оценить», но я не могу понять, почему два разных векторных фильтра работают по-разному. Это потому, что school_hours содержит символы и целые числа school_hours2?
РЕДАКТИРОВАТЬ: я изменил строку test_data на:
#some date time data - filtering.
test_data<-as.POSIXct(sample(seq(1127056501, 1127056501), 1000),origin = "1899-12-31",tz="UTC")
это все еще проблематично:
schools<-td%>%
filter(format(test_data,'%H') %in% school_hours)
генерирует 510 строк
schools2<-td%>%
filter(format(test_data,'%H') %in% school_hours2)
генерирует 379 строк
Все данные, которые меня действительно интересуют, выглядят так: 1899-12-31 23: 59: 00
(где последний6 цифр означают 24-часовое время)
Все, что я действительно пытаюсь сделать, - это преобразовать время из этого 1899-12-31 07:59:00 в час (7)
а затем
используйте
school_hours2<-c(07:18)
в качестве фильтра. Но будет ли час, сгенерированный преобразованием 1899-12-31 07: 59: 00
, равным 07 или 7
Потому что если это 07, то school_hours2 <-c (07:18)генерирует 7, а school_hours2 <-as.character (c (07:18)) генерирует '7' </p>
Как мне обойти это?
РЕДАКТИРОВАТЬ: КАК ЭТО: R:как отфильтровать метку времени по часам и минутам?
td1<-td%>%mutate(timestamp_utc = ymd_hms(test_data,tz="UTC"))%>%
mutate(hour = hour(timestamp_utc))%>%
filter(hour(timestamp_utc) %in% school_hours)
td2<-td%>%mutate(timestamp_utc = ymd_hms(test_data,tz="UTC"))%>%
mutate(hour = hour(timestamp_utc))%>%
filter(hour(timestamp_utc) %in% school_hours2)
td3<-td%>%
mutate(hour = hour(test_data))%>%
filter(hour(test_data) %in% school_hours2)