Eltolásával adatkeret R

szavazat
8

nekem van egy adat keret, mint ez

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

amit én akarok, hogy hozzon létre egy függvényt, amely elmozdulás az adatokat frame értékkel. például:

ha az érték a változó értéke 1 az adatok keret lesz:

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

stb...

A funkció kell, mint ez.

shift<-function(dataframe,shiftvalue)

van-e egyszerű módja annak, hogy ezt a K megadása nélkül a sok hurok ??

A kérdést 12/06/2011 13:14
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
8

itt van a megvalósítása:

> 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
>

Frissítve:

> 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
Válaszolt 12/06/2011 13:38
a forrás felhasználó

szavazat
14

Meg tudod csinálni sok szempontból, de az egyik módja, hogy használja head, és 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
Válaszolt 12/06/2011 13:40
a forrás felhasználó

szavazat
10

Inkább öreg modulo ;-)

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

Ez nagyon egyszerű, az egyetlen trükkje van R re-egy indexelést. Szintén működik a eltolások mint 0, -7vagy 7*nrow(df)...

Válaszolt 12/06/2011 15:09
a forrás felhasználó

szavazat
1

Van egy shiftfunkció taRifx, hogy működik a vektorok. Ennek alkalmazása eredményezi coersion összes oszlopot karakter ha vannak jellegű, így fogjuk használni a trükk plyr. Majd valószínűleg levelet data.frame eljárás hamarosan:

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

Az előnye shiftaz, hogy vesz egy csomó lehetőség:

  • n lehet pozitív vagy negatív körbefolyatást a bal / jobb
  • pakolás lehet be- vagy kikapcsolni
  • Ha pakolás ki van kapcsolva, pad lehet bekapcsolva a pad NAS így vektor marad az azonos hosszúságú
Válaszolt 01/08/2011 06:12
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more