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 .
3 Réponses :
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
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
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
Pour faire ce que vous avez décrit, vous devez créer une liste de blocs de données.