Фрейм данных "расширить" процедуру в R? - PullRequest
2 голосов
/ 31 января 2012

Это не реальный статистический вопрос, а вопрос о подготовке данных перед выполнением фактического статистического анализа. У меня есть фрейм данных, который состоит из разреженных данных. Я хотел бы «расширить» эти данные, чтобы включить нули для пропущенных значений, группировать по группам.

Вот пример данных (a и b - два фактора, определяющих группу, t - это разреженная временная метка, а x - это значение):

test <- data.frame(
    a=c(1,1,1,1,1,1,1,1,1,1,1),
    b=c(1,1,1,1,1,2,2,2,2,2,2),
    t=c(0,2,3,4,7,3,4,6,7,8,9),
    x=c(1,2,1,2,2,1,1,2,1,1,3))

Предполагая, что я хотел бы расширить значения между t=0 и t=9, это результат, на который я надеюсь:

test.expanded <- data.frame(
    a=c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
    b=c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2),
    t=c(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9),
    x=c(1,0,2,1,2,0,0,2,0,0,0,0,0,1,1,0,2,1,1,3))

Нули были вставлены для всех пропущенных значений t. Это облегчает использование.

У меня есть быстрая и грязная реализация, которая сортирует информационный кадр и проходит по каждой из его строк, добавляя пропущенные строки по одной за раз. Но я не совсем доволен решением. Есть ли лучший способ сделать это?

Для тех, кто знаком с SAS, он похож на proc expand.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 31 января 2012

Как вы отметили в комментарии к другому ответу, сделать это по группам легко с помощью plyr, который просто оставляет, как «заполнять» наборы данных.Мой подход состоит в том, чтобы использовать merge.

library("plyr")

test.expanded <- ddply(test, c("a","b"), function(DF) {
  DF <- merge(data.frame(t=0:9), DF[,c("t","x")], all.x=TRUE)
  DF[is.na(DF$x),"x"] <- 0
  DF
})

merge с all.x=TRUE, чтобы сделать пропущенные значения NA, поэтому для замены этих NA s необходима вторая строка функциис 0.

1 голос
/ 31 января 2012

Это запутанно, но отлично работает:

> test <- data.frame(
+   a=c(1,1,1,1,1,1,1,1,1,1,1),
+   b=c(1,1,1,1,1,2,2,2,2,2,2),
+   t=c(0,2,3,4,7,3,4,6,7,8,9),
+   x=c(1,2,1,2,2,1,1,2,1,1,3))
> 
> my.seq <- seq(0,9)
> not.t <- !(my.seq %in% test$t)
> test[nrow(test)+seq(length(my.seq[not.t])),"t"] <- my.seq[not.t]
> test
    a  b t  x
1   1  1 0  1
2   1  1 2  2
3   1  1 3  1
4   1  1 4  2
5   1  1 7  2
6   1  2 3  1
7   1  2 4  1
8   1  2 6  2
9   1  2 7  1
10  1  2 8  1
11  1  2 9  3
12 NA NA 1 NA
13 NA NA 5 NA

Не уверен, хотите ли вы отсортировать по t впоследствии или нет.Если это так, достаточно просто сделать:

https://stackoverflow.com/a/6871968/636656

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...