R - 列的列表子集列表

时间:2018-04-23 21:25:02

标签: r list dataframe

我有一个名为“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

1 个答案:

答案 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