2016-09-07 16 views
0

Я использовал довольно много битов кода, которые выделяют, когда определенные требования не выполняются, или говорят мне, какие записи дублируются, но я не смог выяснить как закодировать, если требование не выполняется.Флаг, если требование не удовлетворено

Я использую относительно средний dataframe, который включает даты. Обычно должно быть 24 входа в день, т. Е. Один раз в час. Но в некоторых случаях это больше или меньше. Мне нужно что-то, что скажет мне, какой номер/данные входа не удовлетворяет этим критериям из 24 записей. Есть ли у кого-нибудь предложения о том, как подойти к этому?

Приведенный ниже пример кода, который я использовал до сих пор (для выполнения других функций).

td_1 <- read.csv("testdata_1.csv", header=TRUE) 
td_1$OB_DATE <- as.Date(td_1$OB_DATE) 

valueMissing <- seq(min(td_1$OB_DATE), max(td_1$OB_DATE), by = 1) 
valueMissing[!valueMissing %in% td_1$OB_DATE] 

countDup <- anyDuplicated(td_1$OB_DATE) 
valueDup <- td1[duplicated(td_1$OB_DATE),] 

Ниже приведен пример данных (обратите внимание, что в действительности существует более 500 000 строк, это всего лишь небольшой образец)

OB_DATE    AIR_TEMPERATURE 
09/05/1973 00:00 10 
09/05/1973 01:00 10.2 
09/05/1973 02:00 10 
09/05/1973 03:00 10 
09/05/1973 04:00 9.9 
09/05/1973 05:00 9.9 
09/05/1973 06:00 10.2 
09/05/1973 07:00 10.8 
09/05/1973 08:00 12.2 
09/05/1973 09:00 11.9 
09/05/1973 10:00 12.7 
09/05/1973 11:00 12.8 
09/05/1973 12:00 13.4 
09/05/1973 13:00 13.9 
09/05/1973 14:00 14.6 
09/05/1973 15:00 13.5 
09/05/1973 16:00 13.5 
09/05/1973 17:00 12.8 
09/05/1973 18:00 12.2 
09/05/1973 19:00 11.9 
09/05/1973 20:00 11 
09/05/1973 21:00 10.3 
09/05/1973 22:00 10.2 
09/05/1973 23:00 10 
10/05/1973 00:00 10 
10/05/1973 01:00 9.8 
10/05/1973 02:00 9.6 
10/05/1973 03:00 9.7 
10/05/1973 04:00 9.5 
10/05/1973 05:00 8.5 
10/05/1973 06:00 7.5 
10/05/1973 07:00 7.8 
10/05/1973 08:00 8.8 
10/05/1973 09:00 9.6 
10/05/1973 10:00 10 
10/05/1973 11:00 11 
10/05/1973 12:00 8 
10/05/1973 13:00 10.3 
10/05/1973 14:00 12.2 
10/05/1973 15:00 12.7 
10/05/1973 16:00 12.7 
10/05/1973 17:00 12.4 
10/05/1973 17:00 12.4 
10/05/1973 18:00 12 
10/05/1973 18:00 12 
10/05/1973 19:00 10.9 
10/05/1973 20:00 9.4 
10/05/1973 21:00 7.2 
10/05/1973 22:00 6.7 
10/05/1973 23:00 6.8 
11/05/1973 00:00 5.7 
11/05/1973 01:00 5.2 
11/05/1973 02:00 4.7 
11/05/1973 03:00 4.3 
11/05/1973 04:00 4 
11/05/1973 05:00 4.2 
11/05/1973 06:00 5 
11/05/1973 08:00 8.4 
11/05/1973 09:00 9.2 
11/05/1973 10:00 10.8 
11/05/1973 11:00 11.7 
11/05/1973 12:00 11.4 
11/05/1973 13:00 12.9 
11/05/1973 14:00 13.3 
11/05/1973 15:00 13.3 
11/05/1973 16:00 13.5 
11/05/1973 17:00 13.6 
11/05/1973 18:00 12.6 
11/05/1973 19:00 11.8 
11/05/1973 20:00 10.3 
11/05/1973 21:00 9.7 
11/05/1973 22:00 8.8 
11/05/1973 23:00 7.6 

В этой ситуации данные по 10 завершена с 24 входами, но для 11-го - только 26 записей, а 12-е - 23 записи. Мне нужно что-то, что предупредит меня об этом факте, например. давая даты 11/05/1973 и 12/05/1973 (похожие на выходные данные, которые я создал для кода недостающих значений).

ответ

1

Использование dplyr,

library(dplyr) 
df %>% 
    group_by(dates = gsub('\\s+.*', '', OB_DATE)) %>% 
    summarise(new = n()) 
# A tibble: 3 × 2 
#  dates new 
#  <chr> <int> 
#1 1973-09-05 24 
#2 1973-10-05 26 
#3 1973-11-05 23 

или так же вы можете сделать что-то подобное,

df %>% 
group_by(dates = gsub('\\s+.*', '', OB_DATE)) %>% 
mutate(new = ifelse(n() == 24, 0, 1)) #Will give value of 1 to dates that don't satisfy the 24 criterion 
select(-dates) 
+1

Спасибо, ваш первый вариант предоставляет информацию в наиболее лаконичный путь, учитывая огромное количество данных, связанных – Visser

+0

Мне нужно добавить 'a s.data.frame', чтобы просмотреть каждую запись (хотя она ограничивает ее лишь 10), в противном случае она идеальна. – Visser

+0

@ Visser это интересно. Я не знал, что ... – Sotos

2

Мы можем использовать data.table

library(data.table) 
setDT(df)[, new := as.integer(.N==24), by = .(Date=as.IDate(OB_DATE, "%m/%d/%Y %H:%M"))] 
head(df) 
#   OB_DATE AIR_TEMPERATURE new 
#1: 09/05/1973 00:00   10.0 1 
#2: 09/05/1973 01:00   10.2 1 
#3: 09/05/1973 02:00   10.0 1 
#4: 09/05/1973 03:00   10.0 1 
#5: 09/05/1973 04:00    9.9 1 
#6: 09/05/1973 05:00    9.9 1 
Смежные вопросы