使用magrittr语法向data.frames列表添加变量

使用magrittr语法向data.frames列表添加变量,r,magrittr,R,Magrittr,假设您有环境中已存在的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,然

假设您有环境中已存在的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\u 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?

我一直认为,通过接受嵌套调用并将其从内到外转换,可以获得
magrittr
-惯用的方法。所以,对你的最后一个片段这样做会产生

paste0("z", 2011:2015) %>%
  lapply(function(name) data.frame(x = get(name)$x, year = name)) %>% 
  do.call(rbind, .)
我觉得很好。我不太喜欢将所有可能的语句分解为
x%>%foo1%>%foo2%>%…
,在这种情况下,这是另外一个合理的理由:否则您必须再次重复
paste0
调用以重构变量名(如注释中所建议的)。

data

首先,为了更好的可读性,我将把您的示例缩短一点

# 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
solution

您不应该使用
lappy(get(x))
,而应该使用
mget
。 您应该在
lappy
中使用
extract
而不是
extract2
,因为您希望保留
数据帧

然后,指定列的惯用方法是使用
inset
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\u 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
我会做
df%lappy(get)%%>%lappy(function(x)x[[“x”]])%%>%as.data.frame()%%>%set_names(paste0(“z”,2011:2015))%%>%melt
,但这不是很习惯用法
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