1
votes

Transformez un data.frame en une série chronologique de données sous forme de liste

J'ai le jeu de données de jouet suivant:

$UK

year   apples.k   pears.k
2000   340        22
2001   200        33
2002   235        44

Les données ressemblent à ceci:

$USA

year   apples.k   pears.k
2000   100        99
2001   60         88
2002   123        77

Cependant, je dois être en mesure de appelez l'ensemble de données par dat [1] et obtenez ce qui suit:

dat

  country year apples.k pears.k
1     USA 2000      100      99
2     USA 2001       60      88
3     USA 2002      123      77
4      UK 2000      340      22
5      UK 2001      200      33
6      UK 2002      235      44

... et la même chose avec le Royaume-Uni ( dat [ 2] ):

dat = data.frame(
        country = c("USA", "USA", "USA", "UK", "UK", "UK"),
        year = c(2000, 2001, 2002, 2000, 2001, 2002),
        apples.k = c(100, 60, 123, 340, 200, 235),
        pears.k = c(99, 88, 77, 22, 33, 44)
        )

Donc, si je comprends bien, chaque entrée du nouvel objet doit être une matrice d'un sous-système de variables ("year", "apples.k", "pears.k"). Et j'ai cette "matrice d'un sous-système de variables" pour chaque pays (US et UK).

Eh bien, en réalité, j'ai presque 300 ans pour chaque pays du monde, et environ 6 variables.

Merci .


1 commentaires

Pour faire ce que vous avez décrit, vous devez créer une liste de blocs de données.


3 Réponses :


3
votes

Il existe une fonction pour cela, nommée split():

dat <- split(dat, dat$country)

> dat
$UK
  country year apples.k pears.k
4      UK 2000      340      22
5      UK 2001      200      33
6      UK 2002      235      44

$USA
  country year apples.k pears.k
1     USA 2000      100      99
2     USA 2001       60      88
3     USA 2002      123      77


0 commentaires

1
votes

Si vous écrivez une fonction, vous pourrez peut-être réaliser ce que vous voulez sans modifier dat

foo = function(n, x = dat, f = "country"){
    nm = unique(x[[f]])[n]
    setNames(list(subset(x, x[[f]] == nm)), nm)
}

foo(1)
#$USA
#  country year apples.k pears.k
#1     USA 2000      100      99
#2     USA 2001       60      88
#3     USA 2002      123      77


0 commentaires

1
votes

Nous pouvons utiliser group_split

library(dplyr)
dat %>%
    group_split(country)
#[[1]]
# A tibble: 3 x 4
#  country  year apples.k pears.k
#  <fct>   <dbl>    <dbl>   <dbl>
#1 UK       2000      340      22
#2 UK       2001      200      33
#3 UK       2002      235      44

[[2]]
# A tibble: 3 x 4
#  country  year apples.k pears.k
#  <fct>   <dbl>    <dbl>   <dbl>
#1 USA      2000      100      99
#2 USA      2001       60      88
#3 USA      2002      123      77


0 commentaires