假设您有一个已存在于环境中的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)
}
)
)
答案 0 :(得分: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
中使用extract2
而不是lapply
,因为您希望保留data.frame
。
然后,分配列的惯用magrittr
方式是使用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_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