如何更优雅地操作不同列表中的data.frame对象?

如何更优雅地操作不同列表中的data.frame对象?,r,list,dataframe,R,List,Dataframe,列表中有data.frame对象,它是我实现的函数的输出。不过,我打算在不同列表中的data.frame对象将其放在一起的地方创建一个新列表。我尝试了几种方法来获得我的预期输出,但效果不太好。有人知道有效地进行这种操作的有用技巧吗?有什么优雅的解决方案来完成这项任务吗?有什么想法吗 这是一个小例子: savedList <- list( foo_saved = data.frame(v1=c(1,6,16), v2=c(4,12,23)), bar_saved = data.fra

列表中有data.frame对象,它是我实现的函数的输出。不过,我打算在不同列表中的data.frame对象将其放在一起的地方创建一个新列表。我尝试了几种方法来获得我的预期输出,但效果不太好。有人知道有效地进行这种操作的有用技巧吗?有什么优雅的解决方案来完成这项任务吗?有什么想法吗

这是一个小例子:

savedList <- list(
  foo_saved = data.frame(v1=c(1,6,16), v2=c(4,12,23)),
  bar_saved = data.frame(v1=c(7,19,31), v2=c(16,28,41)),
  cat_saved = data.frame(v1=c(5,13,26), v2=c(11,21,42))
)

dropedList <- list(
  foo_droped = data.frame(v1=c(4,9,20), v2=c(7,15,29)),
  bar_droped = data.frame(v1=c(14,26,35), v2=c(21,30,47)),
  cat_droped = data.frame(v1=c(18,29,39), v2=c(25,36,48))
)

savedList您可以使用
mapply
为此,它将迭代两个列表,并为每对项目创建一个列表:

res <- mapply( list, savedList, dropedList, SIMPLIFY = F)
str(res)
List of 3
 $ foo_saved:List of 2
  ..$ :'data.frame':    3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 1 6 16
  .. ..$ v2: num [1:3] 4 12 23
  ..$ :'data.frame':    3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 4 9 20
  .. ..$ v2: num [1:3] 7 15 29
 $ bar_saved:List of 2
  ..$ :'data.frame':    3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 7 19 31
  .. ..$ v2: num [1:3] 16 28 41
  ..$ :'data.frame':    3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 14 26 35
  .. ..$ v2: num [1:3] 21 30 47
 $ cat_saved:List of 2
  ..$ :'data.frame':    3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 5 13 26
  .. ..$ v2: num [1:3] 11 21 42
  ..$ :'data.frame':    3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 18 29 39
  .. ..$ v2: num [1:3] 25 36 48

res您可以合并这两个列表,然后在名称的公共部分拆分
split()
不是有史以来最有效的函数,但其代码非常简单

x <- c(savedList, dropedList)
split(x, sub("_.*", "", names(x)))

purrr::transpose(list(saved=savedList,droped=dropedList))
可能是一个选项。@lukeA:谢谢,这个也很好。
mappy
with
SIMPLIFY=FALSE
Map
。谢谢。新获取的列表现在变为嵌套列表,如何取而代之地从嵌套列表中取出?我想对每个子列表做进一步的操作?有什么想法吗?请记住,此解决方案取决于两个列表中元素的一对一顺序。是的,此解决方案很好。谢谢你的帮助。我宁愿接受使用Rich的解决方案。我知道你会讨厌它,但这很好:
c(savedList,dropedList)%%>%split(substr(names(.),1,3))
我个人不太喜欢合并列表并对它们进行分组。你的解决方案很有趣,我会试试。@Andy.Jian-
split(x,sub(“,”,names(x)))[c(“foo”,“bar”,“cat”)]
?如果你是根据原始列表中的名称进行排序,你可以使用
[sub(“,”,names(savedList))
代替上面的
[c(“foo”,“bar”,“cat”)]
,这正是我想要的。谢谢你的大力帮助:)
x <- c(savedList, dropedList)
split(x, sub("_.*", "", names(x)))
List of 3
 $ bar:List of 2
  ..$ bar_saved :'data.frame':  3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 7 19 31
  .. ..$ v2: num [1:3] 16 28 41
  ..$ bar_droped:'data.frame':  3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 14 26 35
  .. ..$ v2: num [1:3] 21 30 47
 $ cat:List of 2
  ..$ cat_saved :'data.frame':  3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 5 13 26
  .. ..$ v2: num [1:3] 11 21 42
  ..$ cat_droped:'data.frame':  3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 18 29 39
  .. ..$ v2: num [1:3] 25 36 48
 $ foo:List of 2
  ..$ foo_saved :'data.frame':  3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 1 6 16
  .. ..$ v2: num [1:3] 4 12 23
  ..$ foo_droped:'data.frame':  3 obs. of  2 variables:
  .. ..$ v1: num [1:3] 4 9 20
  .. ..$ v2: num [1:3] 7 15 29