我有一个名为“foo”的列表,其中包含三个名为subfoo1,subfoo2,subfoo3的子列表。每个子列表都有12个以下形式的数据帧:
CFBundleIconName
我想在列表中创建列表元素/数据帧,它合并了subfoo1,subfoo2和subfoo3的第一个数据帧;那么,第二个数据帧应该合并subfoo1 [[2]],subfoo2 [[2]],subfoo3 [[2]]等等。所以第一个数据帧的预期输出应该是:
$subfoo1[[1]]
length h
out1 12 h=12
out2 12 h=12
out3 12 h=55
out4 12 h=24
$subfoo1[[2]]
length h
out1 11 h=32
out2 11 h=52
out3 11 h=51
out4 11 h=6
.....
.....
$subfoo2[[1]]
length h
out1 12 h=3
out2 12 h=2
out3 12 h=1
out4 12 h=2
.....
.....
$subfoo3[[1]]
length h
out1 12 h=12
out2 12 h=54
out3 12 h=12
out4 12 h=1
我认为使用$newfoo1
h_subfoo1 h_subfoo2 h_subfoo3
out1 h=12 h=3 h=12
out2 h=12 h=2 h=54
out3 h=55 h=1 h=12
out4 h=24 h=2 h=1
和lapply
两次应该有效,但我找不到解决方案。
我的尝试是这样的:
do.call
答案 0 :(得分:0)
您可以使用purrr::transpose
数据强>
df <- read.table(text="length h
out1 12 h=12
out2 12 h=12
out3 12 h=55
out4 12 h=24",h=T,strin=F)
input <- list(subfoo1=list(df,df,df),
subfoo2=list(df,df,df))
<强>溶液强>
library(purrr)
map(transpose(input),~map_dfc(.x,"h"))
# [[1]]
# # A tibble: 4 x 2
# subfoo1 subfoo2
# <chr> <chr>
# 1 h=12 h=12
# 2 h=12 h=12
# 3 h=55 h=55
# 4 h=24 h=24
#
# [[2]]
# # A tibble: 4 x 2
# subfoo1 subfoo2
# <chr> <chr>
# 1 h=12 h=12
# 2 h=12 h=12
# 3 h=55 h=55
# 4 h=24 h=24
#
# [[3]]
# # A tibble: 4 x 2
# subfoo1 subfoo2
# <chr> <chr>
# 1 h=12 h=12
# 2 h=12 h=12
# 3 h=55 h=55
# 4 h=24 h=24
基础R
df_work <- expand.grid(seq(length(input)), seq(lengths(input)[[1]]))
df_work$hcol <- apply(df_work,1,function(x) setNames(input[[c(x[1],x[2])]]["h"],paste0("subfoo",x[1])))
tapply(df_work$hcol,df_work$Var2,do.call,what=cbind)
# $`1`
# subfoo1 subfoo2
# out1 h=12 h=12
# out2 h=12 h=12
# out3 h=55 h=55
# out4 h=24 h=24
#
# $`2`
# subfoo1 subfoo2
# out1 h=12 h=12
# out2 h=12 h=12
# out3 h=55 h=55
# out4 h=24 h=24
#
# $`3`
# subfoo1 subfoo2
# out1 h=12 h=12
# out2 h=12 h=12
# out3 h=55 h=55
# out4 h=24 h=24
再次在基地R
更接近purrr
解决方案
lapply(seq(lengths(input)[[1]]), function(x) # loop on subelement
do.call(
cbind,
lapply(seq(length(input)), function(y) # loop on element
setNames(input[[c(y,x)]]["h"],paste0("h_",names(input)[y])))))
# [[1]]
# h_subfoo1 h_subfoo2
# out1 h=12 h=12
# out2 h=12 h=12
# out3 h=55 h=55
# out4 h=24 h=24
#
# [[2]]
# h_subfoo1 h_subfoo2
# out1 h=12 h=12
# out2 h=12 h=12
# out3 h=55 h=55
# out4 h=24 h=24
#
# [[3]]
# h_subfoo1 h_subfoo2
# out1 h=12 h=12
# out2 h=12 h=12
# out3 h=55 h=55
# out4 h=24 h=24
最后一个
第一个解决方案的呜呜声功能的非常基础版本:
transpose_base <- function(.l){
lapply(seq(lengths(.l)[[1]]),function(x)
setNames(lapply(seq(length(.l)),function(y) .l[[c(y,x)]]),names(.l)))
}
map_dfc_base <- function(.x,.f,...){
setNames(do.call(cbind,lapply(.x,.f,...)),names(.x))
}
lapply(transpose_base(input),map_dfc_base,`[`,"h") # same output