在R中使用命名对象创建列表,并从该列表中检索部分对象

时间:2019-01-10 08:35:39

标签: r list

我有几个数据框(完整数据和归约数据),现在我想使用kmeans和hclust进行大量分析。我希望能够循环工作并将结果存储在列表中,在此列表中,我可以根据对象的名称检索(部分)存储的对象。原因是在R-Markdown中没有创建新对象的好方法(没有,assign不是这样做的好选择)。 因此,我的想法是,在多个数据帧的for循环中创建几个kmeans对象,并将其放入列表中。但是我似乎无法以可以命名这些对象的方式存储它们。在我的清单中,一切都杂乱无章。看我的例子。 要检索所需列表的对象(的一部分),我在处理该部分时遇到问题(请参阅我的最后一部分)

set.seed(4711)
df <- data.frame(matrix(sample(0:6, 120, replace = TRUE), ncol = 15, nrow = 8))
list_of_kmeans_objects <- list()

for (i in 2:4){
  list_of_kmeans_objects <- c(list_of_kmeans_objects, kmeans(df, centers = i))
}

现在,我有36个项目杂乱无章。但是我想要的是带有“项目”的列表,我也想将其命名。我想要的列表是:

C2_kmeans_df <- kmeans(df, centers = 2)
C3_kmeans_df <- kmeans(df, centers = 3)
C4_kmeans_df <- kmeans(df, centers = 4)
desired_list_of_kmeans <- list(C2_kmeans_df, C3_kmeans_df, C4_kmeans_df, C5_kmeans_df)
names(desired_list_of_kmeans)[1] <- "C2_kmeans_df"
names(desired_list_of_kmeans)[2] <- "C3_kmeans_df"
names(desired_list_of_kmeans)[3] <- "C4_kmeans_df"

如果我应该有此列表,我的最后一个问题是如何提取示例

C3_kmeans_df$cluster #or
C4_kmeans_df$tot.withinss

使用所需列表中对象的名称来自此列表吗?

2 个答案:

答案 0 :(得分:2)

这里是使用lapplysetNames的选项。

idx <- 2:4
out <- setNames(object = lapply(idx, function(i) kmeans(df, centers = i)),
                nm = paste0("C", idx, "_kmeans_df"))

检查姓名

names(out)
# [1] "C2_kmeans_df" "C3_kmeans_df" "C4_kmeans_df"

访问cluster

out$C2_kmeans_df$cluster
# [1] 2 1 2 1 2 1 2 1

答案 1 :(得分:1)

在您当前的for循环中,您在每次迭代时都删除list_of_kmeans_objects对象。

以下代码应执行您想要的操作:

list_of_kmeans_objects <- list()
aaa <- 0
for (i in 2:4) {
   aaa <- aaa+1
   list_of_kmeans_objects[[aaa]] <- kmeans(df, centers=i)
   names(list_of_kmeans_objects)[aaa] <- paste0("C", aaa, "_kmeans_df")
}