3

假设您有一个环境中已经存在的 data.frames 列表:

library(magrittr)
lapply(
  paste0("z", 2011:2015),
  function(x) assign(
    x, 
    data.frame(x=rnorm(10),y=rnorm(10)),
    pos = 1
  )
)
# should create z2011 through z2015 in your R env

我想做的是:提取一列,将它们组合成一个 data.frame,然后添加一个额外的变量来使用 magrittr 语法识别它们的来源。

ldply(list)我意识到使用其他技术(即: 、、、、rbind.fill(listing))这是微不足道 rbind_all(listing)do.call(rbind,...)。我的问题的重点是理解使用magrittr语法的方法。

df <- 
   paste0("z",2011:2015) %>%
   lapply(get) %>%
   lapply(function(x) extract2(x,"x")) %>%
   # what would you do next? Another approach you think is
   # more appropriate for magrittr?

我不知道如何添加新变量。例如,我想结束以下内容:

do.call(
  rbind, 
  lapply(
    paste0("z",2011:2015), 
    function(x) {
      data.frame(x = get(x)$x, year = x)
    }
  )
)
4

2 回答 2

0

数据

首先,为了更好的可读性,我会让你的例子更短一些。

# creates data.frames z2011, z2012 and z2013, 2 lines each
lapply(
  paste0("z", 2011:2013),
  function(x) assign(
    x, 
    data.frame(x=rnorm(2),y=rnorm(2)),
    pos = 1
  )
)

magrittr+base解决方案

你不应该使用lapply(get(x))mget而是使用。并且您应该使用extract而不是extract2lapply希望保留的data.frame.

那么magrittr分配列的惯用方式是使用insetor inset2(这里的效果相同)

所以你得到:

mget(paste0("z",2011:2015)) %>%
  lapply(extract,"x") %>%
  Map(inset,.,"year",value = names(.)) %>%
  do.call(rbind,.)

#                   x  year
# z2011.1 -0.62124058 z2011
# z2011.2 -2.21469989 z2011
# z2012.1 -0.01619026 z2012
# z2012.2  0.94383621 z2012
# z2013.1  0.91897737 z2013
# z2013.2  0.78213630 z2013

使用purrr

magrittr通常与 一起tidyverse使用,仅使用purrr::map_dfr您可以编写:

library(purrr)
mget(paste0("z",2011:2013)) %>%
  map_dfr(~.["x"],.id="year")

#    year           x
# 1 z2011 -0.62124058
# 2 z2011 -2.21469989
# 3 z2012 -0.01619026
# 4 z2012  0.94383621
# 5 z2013  0.91897737
# 6 z2013  0.78213630
于 2018-04-10T07:52:24.820 回答
0

我一直认为你可以magrittr通过嵌套调用并将它们翻过来来获得惯用的方法。所以,对你的最后一个片段这样做会产生

paste0("z", 2011:2015) %>%
  lapply(function(name) data.frame(x = get(name)$x, year = name)) %>% 
  do.call(rbind, .)

这对我来说看起来不错。我不喜欢将所有可能的语句分解为x %>% foo1 %>% foo2 %>% ...,在这种情况下,这也是合理的:否则您将不得不paste0再次重复调用以重建变量名称(如评论中所建议的那样)。

于 2015-09-09T20:46:45.843 回答