如何更优雅地操作不同列表中的data.frame对象?
列表中有data.frame对象,它是我实现的函数的输出。不过,我打算在不同列表中的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
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
withSIMPLIFY=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