通过lapply传递函数后如何将对象名称保留为列表

时间:2019-07-12 05:50:21

标签: r dataframe

我具有以下数据功能:

myfunc <- function(ncluster_no = NULL) {
  set.seed(1)
  # ncluster_no <- "Cluster1"
  df <- mtcars[sample(10)[1:3], ]
  my_list <- list(foo = df)
  names(my_list) <- ncluster_no
  my_list
}

myfunc(ncluster_no = "Cluster1")

产生此命名对象(数据帧)

#> $Cluster1
#>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

当我在lapply中使用该功能时:

clusters <- c(
  "Cluster_1",
  "Cluster_2")

list_out <- lapply(clusters, myfunc)

我得到这个结果:

[[1]]
[[1]]$Cluster_1
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2


[[2]]
[[2]]$Cluster_2
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

我想要得到的是简单的命名:

$Cluster_1
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2


$Cluster_2
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

我该如何实现?还是我需要在myfunc中进行任何修改?

1 个答案:

答案 0 :(得分:1)

setOffset(){ this.offsetLeft = document.getElementById("myId").offsetLeft; } sapply一起使用,如果不想使用simplify = F,则不要在函数中返回命名列表:

Cluster_1$Cluster_1

哪个会返回:

myfunc <- function(ncluster_no = NULL) {
    set.seed(1)
    df <- mtcars[sample(10)[1:3], ]
    df
}

clusters <- c("Cluster_1", "Cluster_2")

sapply(clusters, myfunc, simplify = F)

这里最重要的是,该函数返回一个数据框,而不是包含一个数据框的命名列表。如果这样做,则还可以使用$Cluster_1 mpg cyl disp hp drat wt qsec vs am gear carb Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 $Cluster_2 mpg cyl disp hp drat wt qsec vs am gear carb Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 或其他方法(请参见下面有关l <- setNames(lapply(1:2, myfunc), clusters)的评论中Ronak Shah的建议,等等),结果将是相同的,因为其中的名称replicate并未真正发挥该功能的作用。