将data.frame转换为时间序列数据作为列表

时间:2019-10-01 20:08:35

标签: r list dataframe

我有以下玩具数据集:

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

数据如下:

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

但是,我需要能够通过dat[1]调用数据集并获得以下信息:

$USA

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

...与英国(dat[2])相同:

$UK

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

因此,据我所知,新对象中的每个条目都应该是变量子系统(“ year”,“ apples.k”,“ pears.k”)的矩阵。而且每个国家(美国和英国)都有这个“变量子系统矩阵”。

实际上,我对世界上每个国家有将近300年的历史,大约有6个变量。

谢谢。

3 个答案:

答案 0 :(得分:3)

为此提供了一个函数,方便命名为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

答案 1 :(得分:1)

如果您编写函数,则无需修改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

答案 2 :(得分:1)

我们可以使用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