2015-06-22 2 views
2

У меня есть dataframe следующим образом. Теперь я пытаюсь оценить значения значений NA и -999 в столбце A.Как фильтровать значения NA и оценивать их, применяя среднее значение для прошлых записей в R?

Я хочу сделать это, взяв среднее из существующих предыдущих 10-летних значений (5 и 5 ниже) того конкретного месяца, который имеет значения NA или -999. И у меня эти данные для многих, многих идентификаторов.

ID  L1 L2 Year Month R A 
1234 89 65 2003 Jan  11 76 
1234 89 65 2003 Feb  34 86 
1234 89 65 2003 Mar  6 30 
1234 89 65 2003 Apr  7 76 
1234 89 65 2003 May  8 43 
1234 89 65 2003 Jun  90 67 
1234 89 65 2003 Jul  65 13 
1234 89 65 2003 Aug  54 98 
1234 89 65 2003 Sep  3 67 
1234 89 65 2003 Oct  22 0 
1234 89 65 2003 Nov  55 127 
1234 89 65 2003 Dec  66 74 
1234 45 76 2004 Jan  67 3 
1234 45 76 2004 Feb  87 2 
1234 45 76 2004 Mar  98 65 
1234 45 76 2004 Apr  5 78 
1234 45 76 2004 May  4 44 
1234 45 76 2004 Jun  3 53 
1234 45 76 2004 Jul  77 NA 
1234 45 76 2004 Aug  8 98 
1234 45 76 2004 Sep  99 79 
1234 45 76 2004 Oct  76 -999 
1234 45 76 2004 Nov  56 23 
1234 45 76 2004 Dec  4 65 

Пример: Для оценки «A» столбца NA (или -999 иногда) значение в июле 2005 года, я хочу взять среднее значений оставшиеся 10 годы июля месяца (пять значений выше 2005 и пять ниже) для каждого уникального значения идентификатора.

ID  L1 L2 Year Month R A 
1234 45 76 1998 Jul  45 35 
1234 45 76 2001 Jul  33 25 
1234 45 76 2002 Jul  45 34 
1234 45 76 2003 Jul  43 56 
1234 45 76 2004 Jul  56 54 
1234 45 76 2005 Jul  77 NA 
1234 45 76 2006 Jul  88 33 
1234 45 76 2008 Jul  76 28 
1234 45 76 2009 Jul  65 40 
1234 45 76 2011 Jul  43 45 
1234 45 76 2013 Jul  12 32 

Таким образом, мне нужно фильтровать ID и название месяца и вывести записи в течение 10 лет в течение месяца, что оказывает Nas или -999 значения, а затем применить среднее на этих 10 значений для замены этого NA или - 999. Данные огромны.

Как добиться этого в R?

+0

Ухаживать за воспроизводимым примером? Это довольно просто, и простой цикл можно построить, чтобы найти и заменить каждый NA. –

ответ

1

Я думаю, что это делает то, что вы хотите:

indx = which(is.na(df$A)) 
for(i in 1:length(indx)){ 
    subdf = df[which(df$ID == df$ID[indx[i]] & 
        df$Month == df$Month[indx[i]]),] 
    temp = which(subdf$Year == df$Year[indx[i]]) 
    subdf$Year = unique(subdf$Year) 
    subdf = subdf[which(subdf$Year >= (subdf$Year[temp]-5) & 
        subdf$Year <= (subdf$Year[temp]+5)),] 
    df$A[indx[i]] = mean(subdf$A, na.rm=T) 
} 

Я уверен, что есть более красивый способ сделать это. По предложению вы также можете запустить

df$A[which(df$A <= -999)] = NA 

перед выполнением приведенного выше кода.

+1

Здравствуйте @mts. Я подозреваю, что «=» следует заменить на «==» в вашем решении. – RHertel

+1

@RHertel правда и спасибо, отредактировал его. Недостатки отсутствия воспроизводимых данных для запуска кода. Здесь еще одна проблема, несколько лет без записей, поэтому я сделаю еще один шаг. – mts

+1

Это действительно намного проще работать с воспроизводимыми данными. Если я могу добавить еще один комментарий, я думаю, что ваш вектор indx должен включать также случаи, когда df $ A = -999. В любом случае, я подозреваю, что на вопрос теперь ответили в значительной степени. – RHertel