在R语言中列表的问题

3

在使用嵌套列表时,我有些困惑。如果我尝试以下代码,会收到错误提示,但不明白原因:

library(tibble)

data <- list()
data[1][[1]] <- tibble(year = rep(2010,4)) # works
data[1][[2]] <- tibble(year = rep(2011,4)) # gives me an error

# Warning message:
#   In data[1][[2]] <- tibble(year = rep(2011, 4)) :
#   number of items to replace is not a multiple of replacement length

如果你能提供任何帮助,我们将不胜感激。

3个回答

2

试试这个:

data = list()
data[[1]] = list()
data[[1]][[1]] = tibble(year = rep(2010,4))
data[[1]][[2]] = tibble(year = rep(2011,4))

输出:

[[1]]
[[1]][[1]]
# A tibble: 4 × 1
   year
  <dbl>
1  2010
2  2010
3  2010
4  2010

[[1]][[2]]
# A tibble: 4 × 1
   year
  <dbl>
1  2011
2  2011
3  2011
4  2011

1
错误发生的原因是 data[1][[2]] <- tibble(year = rep(2011, 4)) 尝试向通过运行 data[1] 获得的 tibble 添加一个新列 year。通常在使用列表时建议使用双方括号 advisable
为了说明这一点,请参见以下代码的输出:
l <- list()
l[1] <- tibble(year = rep(2010,4))
l
[[1]]
[1] 2010 2010 2010 2010

# subsetting with [1] can be surprising
l[1][1][1][1][1][1][1]
[[1]]
[1] 2010 2010 2010 2010


一种类似于 tidyverse 的方式来构建这样的嵌套列表,避免代码中的重复,可以是:
#using tidyverses' purrr package
data <- list(purrr::map(2010:2011, ~ tibble(year = rep(.x, 4))))

一种可供警惕的替代方法是,参见R地狱中关于增长对象的第二个圆圈,需要正确初始化一个列表,然后填充它。
# initialize, then fill
data <- list(rep(list(NULL), 2))
data[[1]][[1]] <- f(2010)
data[[1]][[2]] <- f(2011)

0
如果您想要一个tibble列表,可以像这样进行索引。
data <- list()

data[1][[1]] <- tibble(year = rep(2010,4))
data[2][[1]] <- tibble(year = rep(2011,4))


str(data)

# List of 2
#  $ : tibble [4 x 1] (S3: tbl_df/tbl/data.frame)
#   ..$ year: num [1:4] 2010 2010 2010 2010
#  $ : tibble [4 x 1] (S3: tbl_df/tbl/data.frame)
#   ..$ year: num [1:4] 2011 2011 2011 2011

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接