Сдвиг кадра данных в R - PullRequest
9 голосов
/ 12 июня 2011

у меня есть такой фрейм данных

A B value
1 1 0.123
2 1 0.213
3 1 0.543
1 2 0.313
2 2 0.123
3 2 0.412

я хочу создать функцию, которая смещает этот фрейм данных на значение. например:

если значение сдвига равно 1, кадр данных станет:

A B value
3 2 0.412
1 1 0.123
2 1 0.213
3 1 0.543
1 2 0.313
2 2 0.123

и т.д ...

функция должна быть такой:

shift<-function(dataframe,shiftvalue)

Есть ли простой способ сделать это в R, не вводя много циклов ??

Ответы [ 4 ]

14 голосов
/ 12 июня 2011

Вы можете сделать это разными способами, но один из них - использовать head и tail:

df <- data.frame(a=1:10, b = 11:20)

shift <- function(d, k) rbind( tail(d,k), head(d,-k), deparse.level = 0 )


> shift(df,3)
    a  b
4   4 14
5   5 15
6   6 16
7   7 17
8   8 18
9   9 19
10 10 20
1   1 11
2   2 12
3   3 13
11 голосов
/ 12 июня 2011

Я предпочитаю простое старое по модулю; -)

shift<-function(df,offset) df[((1:nrow(df))-1-offset)%%nrow(df)+1,]

Это довольно просто, единственная изюминка - индекс R из-одного.Также он работает для смещений, таких как 0, -7 или 7*nrow(df) ...

8 голосов
/ 12 июня 2011

вот моя реализация:

> shift <- function(df, sv = 1) df[c((sv+1):nrow(df), 1:sv),]
> head(shift(iris, 3))
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
7          4.6         3.4          1.4         0.3  setosa
8          5.0         3.4          1.5         0.2  setosa
9          4.4         2.9          1.4         0.2  setosa
> tail(shift(iris, 3))
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica
1            5.1         3.5          1.4         0.2    setosa
2            4.9         3.0          1.4         0.2    setosa
3            4.7         3.2          1.3         0.2    setosa
>

Обновлен:

> shift <- function(df, sv = 1) df[c((nrow(df)-sv+1):nrow(df), 1:(nrow(df)-sv)),]
> head(shift(iris, 3))
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica
1            5.1         3.5          1.4         0.2    setosa
2            4.9         3.0          1.4         0.2    setosa
3            4.7         3.2          1.3         0.2    setosa
> tail(shift(iris, 3))
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
142          6.9         3.1          5.1         2.3 virginica
143          5.8         2.7          5.1         1.9 virginica
144          6.8         3.2          5.9         2.3 virginica
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
1 голос
/ 01 августа 2011

В taRifx есть функция shift, которая работает с векторами. Применение этого приводит к приведению всех столбцов к символу, если таковые имеются, поэтому мы будем использовать трюк из plyr. Скорее всего, я скоро напишу для него метод data.frame:

dd <- data.frame(b = seq(4),
      x = c("A", "D", "A", "C"), y = c('a','b','c','d'),
      z = c(1, 1, 1, 2),stringsAsFactors=FALSE)

> dd
  b x y z
1 1 A a 1
2 2 D b 1
3 3 A c 1
4 4 C d 2

library(taRifx)
library(plyr)
shift.data.frame <- colwise(shift)
> shift.data.frame(dd)
  b x y z
1 2 D b 1
2 3 A c 1
3 4 C d 2
4 1 A a 1
> shift(dd,n=-1)
  b x y z
1 4 C d 2
2 1 A a 1
3 2 D b 1
4 3 A c 1
> shift(dd,n=-1,wrap=FALSE)
  b x y z
1 1 A a 1
2 2 D b 1
3 3 A c 1
> shift(dd,n=-1,wrap=FALSE,pad=TRUE)
   b    x    y  z
1 NA <NA> <NA> NA
2  1    A    a  1
3  2    D    b  1
4  3    A    c  1

Преимущество shift состоит в том, что он принимает несколько вариантов:

  • n может быть положительным или отрицательным для переноса слева / справа
  • Обертка может быть включена или выключена
  • Если обтекание выключено, пэд можно включить на пэд с NA, поэтому вектор остается той же длины
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...