R фрейм данных - номер строки увеличивается - PullRequest
0 голосов
/ 25 октября 2011

Предполагая, что у нас есть фрейм данных (третий столбец - столбец даты), который содержит наблюдения нерегулярных событий, начиная с января 2000 года по октябрь 2011 года. Цель состоит в том, чтобы выбрать те строки фрейма данных, которые содержат наблюдения между двумя датами

start<-"2005/09/30"
end<-"2011/01/31"  

Исходный фрейм данных содержит около 21 000 строк. Мы можем проверить это, используя length(df_original$date_column).

Теперь мы создаем новый фрейм данных, который содержит даты, более новые, чем дата начала:

df_new<-df_original[df_original$date_column>start,]

Если я проверю длину с помощью length(df_new$date_column), то для длины будет показано около 13 000.

Теперь мы создадим еще один фрейм данных, применяя второй критерий (меньше даты окончания):

df_new2<-df_new[df_new$date_column<end,]

Если я еще раз проверю длину, используя length(df_new2$date_column), то будет показано около 19 000 отсчетов для длины.

Как это возможно, что при применении второго критерия к новому фрейму данных df_new количество строк увеличивается? df_new должно иметь количество строк, равное или меньшее 13 000.

Фрейм данных довольно большой, поэтому я не могу разместить его здесь. Может быть, кто-то может указать причину, при которой такое поведение происходит.

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

У меня нормально работает следующий пример:

df_original = data.frame(date_column = seq(as.Date('2000/01/01'), Sys.Date(), by=1), value = 1)

start = as.Date('2005/09/30')
end   = as.Date('2011/01/31')

df_new = df_original[df_original$date_column>start,]

df_new2 = df_new[df_new$date_column<end,]
> dim(df_original)
[1] 4316    2
> dim(df_new)
[1] 2216    2
> dim(df_new2)
[1] 1948    2

Не видя примера ваших реальных данных, я бы предложил 2 вещи, на которые стоит обратить внимание:

  1. Убедитесь, что ваши даты закодированы как даты.
  2. Убедитесь, что вы случайно не индексируете по имени строки. Это распространенный виновник поведения, о котором вы говорите.
1 голос
/ 25 октября 2011

Можете ли вы дать нам dput(head(df_original))?которая делится с нами первыми 5 записями и их структурой данных.Я подозреваю, что что-то не так с форматом вашего date_column.

Если вы сохраняете start и end в виде строк (что, по-видимому, указывает ваш пример), а столбец даты также является строкой, вы не сможете использовать < или > для сравнения значений дат.Итак, где-то вам нужно проверить, что все сравниваемые известны как R как даты.

1 голос
/ 25 октября 2011

Можете ли вы получить нужные результаты с помощью одной команды подмножества?

df_new <- df_original[with(df_original, date_column>start & date_column<end),]
# or
df_new <- subset(df_original, date_column>start & date_column<end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...