2016-09-21 8 views
0

Я хотел бы применить фильтр Савицки-Голе (от prospectr) к набору образцов, взятых для различных областей интересов. Вот пример данных.Фильтр Савицки-Голе для большого набора данных

> head(file,10) 
    subject eye sample_num area sample_value 
     1 L   1 1 -7.813280 
     1 L   2 1 -7.816787 
     1 L   3 1 -7.826342 
     1 L   4 1 -7.799060 
     1 L   5 1 -7.817019 
     1 L   6 1 -7.845589 
     1 L   7 1 -7.881824 
     1 L   8 1 -7.969951 
     1 L   9 1 -8.022991 
     1 L   10 1 -8.118056 


> dput(head(file)) 
structure(list(subject = c(1L, 1L, 1L, 1L, 1L, 1L), eye = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("L", "R"), class = "factor"), 
    sample_num = 1:6, area = c(1L, 1L, 1L, 1L, 1L, 1L), sample_value = c(-7.81328047761194, 
-7.81678696801706, -7.82634248187633, -7.79906019616205, 
-7.81701949680171, -7.84558887846482)), .Names = c("subject", 
"eye", "sample_num", "area", "sample_value"), row.names = c(NA, 
6L), class = "data.frame") 

Значение в sample_value соответствует положению глаза записанного для левого и правого глаза и были взяты каждой миллисекунда.

Что я хочу сделать, это применить фильтр к образцу данных в каждой области. Я попытался использовать ddply из пакета plyr, чтобы разбить файл на подмножества по теме, глазу и области и применить фильтр (я хочу сохранить как исходные значения выборки, так и значения, полученные после фильтрации в новом столбце). Код ниже.

newfile <- ddply(file, .(file$subject, file$eye, file$area), 
      function(x){ 
       x$sg_filtered <- savitzkyGolay(x$sample_value, 1,1,3) 
       return(x)}) 

Тем не менее, я получаю следующее сообщение об ошибке:

Error in `$<-.data.frame`(`*tmp*`, "sg", value = c(-0.00653100213219515, : 
    replacement has 1838 rows, data has 1840 

Предположительно, это происходит потому, что колонка, содержащая отфильтрованные данные не будет иметь соответствующее значение для первого и последнего sample_value в каждой области. Есть ли способ настроить код так, чтобы я получил NA для них и сохранил два столбца одинаковой длины? Я бы очень признателен за любую помощь в этом. Спасибо!

+0

вы можете использовать 'dput (головка (файл))' вернуть воспроизводимый образец. Это из правильной упаковки 'probr'? –

+0

Привет, спасибо за комментарий. Я отредактировал вопрос и использовал 'dput (head (file))', как вы сказали. – user2711113

ответ

1

Если вы хотите раздуть возвращаемый вектор с NA с, вы можете просто использовать c():

set.seed(123) 
x <- rnorm(100) 
w <- 3 # must be odd number 
out <- c(rep(NA, (w-1)/2), savitzkyGolay(x, 1, 1, w = w), rep(NA, (w-1)/2)) 
length(out) 
# [1] 100 
head(out) 
# [1]   NA 1.0595920 0.1503429 -0.7147103 0.8222783 0.1658142 
tail(out) 
# [1] 0.01382324 0.41334027 1.06643511 -1.21151668 -1.27951576   NA 
Смежные вопросы