2015-11-13 4 views
1

Я хотел бы выполнить линейную интерполяцию в переменной кадра данных, которая учитывает: 1) разницу во времени между двумя точками, 2) момент, когда данные были взяты, и 3) человек, принятый для измерения переменной.R: Интерполяция NA по группам

Например, в следующем dataframe:

df <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3), 
      Individuals=c(1,1,1,1,1,1,1,2,2,2), 
      Value=c(1, 2, 3, NA, 5, NA, 7, 5, NA, 7)) 
    df 

Я хотел бы получить:

result <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3), 
       Individuals=c(1,1,1,1,1,1,1,2,2,2), 
       Value=c(1, 2, 3, 4, 5, 6, 7, 5, 5.5, 6)) 
result 

Я не могу использовать исключительно функцию na.approx пакета zoo, потому что все наблюдения не являются consecutives, некоторые наблюдения принадлежат одному человеку, а другие наблюдения принадлежат другим. Причина в том, что если второй человек будет иметь свое первое окошко с NA, и я бы использовал исключительно функцию na.approx, я бы использовал информацию из individual==1 для интерполяции NA из individual==2 (например, следующий фрейм данных имел бы sucherror)

df_2 <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3), 
       Individuals=c(1,1,1,1,1,1,1,2,2,2), 
       Value=c(1, 2, 3, NA, 5, NA, 7, NA, 5, 7)) 
    df_2 

Я попытался с помощью пакетов zoo и dplyr:

library(dplyr) 
library(zoo) 
proof <- df %>% 
    group_by(Individuals) %>% 
    na.approx(df$Value) 

Но я не могу выполнить group_by в zoo объекта.

Знаете ли вы, как интерполировать значения NA в одной переменной по группам?

Спасибо заранее,

+0

Не могли бы вы разработать немного о том, что ваш желаемый результат будет? Кроме того, что такое группировка «Ear_tag», которую вы пытаетесь сделать. Этот столбец не существует в представленном вами кадре данных? – Pash101

ответ

3

Использование data.frame, а не cbind создавать свои данные. cbind возвращает матрицу, но вам нужен фрейм данных для dplyr. Затем используйте na.approx внутри mutate. Я прокомментировал group_by, так как вы не указали переменную группировки в своих данных, но этот подход должен работать, как только вы добавили переменную группировки в фрейм данных.

df <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3), 
      Individuals=c(1,1,1,1,1,1,1,2,2,2), 
      Value=c(NA, 2, 3, NA, 5, NA, 7, 8, NA, 10)) 

library(dplyr) 
library(zoo) 

df %>% 
    group_by(Individuals) %>% 
    mutate(ValueInterp = na.approx(Value, na.rm=FALSE)) 

    time Individuals Value ValueInterp 
1  1   1 NA   NA 
2  2   1  2   2 
3  3   1  3   3 
4  4   1 NA   4 
5  5   1  5   5 
6  6   1 NA   6 
7  7   1  7   7 
8  1   2  8   8 
9  2   2 NA   9 
10 3   2 10   10 
+0

Отлично, он работает для примера 'df', но не работает, когда' NA' находится в первом или последнем наблюдении, как в примере, предложенном в 'df_2'. Возможно ли, что код интерполирует по крайней мере данные для наблюдений, которые не являются первым или последним наблюдением? – Ruben

+1

Просто добавьте 'na.rm = FALSE' (см. Обновленный код). Затем ведущие и конечные значения NA будут сохранены в результирующем векторе. – eipi10

+0

И как я могу выполнить интерполяцию для всего набора данных, если у меня есть 1 или 2 наблюдения для одного человека, и эти меры являются NA? Например, в данных datafrate: 'df <- data.frame (time = c (1,2,3,4,5,6,7,1,2,3), Физические лица = c (3,3, 1,1,1,1,1,2,2,2), Значение = c (NA, 2, 3, NA, 5, NA, 7, 8, NA, 10)) ' Я хотел бы получить интерполяция для остальных данных, но когда я применил этот код, R говорит: «Ошибка в приближении (x [! na], y [! na], xout, ...): нужно, по крайней мере, два значения не-NA для interpolate'. Есть ли способ не принимать во внимание невозможные случаи? – Ruben

3

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

library(data.table) 
library(zoo) 
setDT(df1)[, ValueInterp:= na.approx(Value, na.rm=TRUE), by = Individual] 
+1

Да, это работает в случаях, когда 'NA' не находится в первом или последнем оговоре одного человека, но не работает, когда' NA' является первым или последним наблюдением. Однако худшим является то, что data.table предоставляет результат, предоставляющий элементы (предупреждение) и плохое назначение назначения, что опасно, если вы запускаете большой код, где вы не можете проверить все предупреждающие сообщения. – Ruben

+0

@Ruben Для 'df_2', каков ожидаемый результат? – akrun

+0

Выход должен иметь интерполяцию всех «NA», кроме тех, которые являются первым или последним наблюдением одного человека. – Ruben

Смежные вопросы