Создать список с именованными объектами в R и извлечь части объектов из этого списка - PullRequest
0 голосов
/ 10 января 2019

У меня есть несколько фреймов данных (полные данные и сокращенные данные), и теперь я хочу провести большой анализ с помощью kmeans и hclust. Я хочу иметь возможность работать в цикле и сохранять результаты в списке, где я могу получить (части) сохраненных объектов на основе их имен. Причина в том, что в R-Markdown нет хорошего способа создания новых объектов (и нет, назначение не является хорошим вариантом для этого). Идея в том, что я создаю несколько kmeans-объектов в цикле for на нескольких фреймах данных и помещаю их в список. Но я не могу хранить их таким образом, чтобы я мог назвать эти объекты. В моем списке все загромождено. Смотрите мой пример. Чтобы получить (части) объект нужного списка, у меня есть проблемы, как обратиться к этим частям (см. Мою последнюю часть)

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 голосов
/ 10 января 2019

В вашем подарочном цикле 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")
}
0 голосов
/ 10 января 2019

Вот вариант с использованием lapply и setNames.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...