#r #dataframe
#r #фрейм данных
Вопрос:
У меня есть несколько фреймов данных в R, которые необходимо обрабатывать одинаково. Выходные данные необходимо распечатать в отдельные файлы. Это работает в принципе, но я не смог автоматически назначить имя каждого фрейма данных в качестве соответствующего имени файла.
Я пробовал разные подходы, но я продвинулся дальше всего, объединив фреймы данных в список, например:
# Load libraries
library(tidyverse)
library(pheatmap)
# Make data frames and combine in list
df1 <- data.frame("Aa" = sample(LETTERS, 5), "Bb" = 1:5, "Cc" = 3:7)
df2 <- data.frame("Aa" = sample(LETTERS, 10), "Dd" = 8:17, "Ee" = 12:21)
dflist <- list(df1, df2)
# Assign names back to data frames in list
names(dflist) <- c("df1", "df2")
# Create heatmap with each data frame and save as separate pdf file:
lapply(dflist, function(x){
x_dflist_heatmap <- column_to_rownames(x, var = "Aa")
pdf(paste0("heatmap_", x, ".pdf"))
pheatmap(x_dflist_heatmap, scale = "row", main = paste0(x))
dev.off()
})
Это дает два файла pdf с правильными тепловыми картами и очень полезными именами heatmap_c(2, 5, 1, 4, 3). pdf и тепловая карта_c(3, 9, 6, 10, 5, 2, 7, 1, 4, 8). pdf.
Я предполагаю, что проблема в том, что я говорю R перечислить фактический фрейм данных, а не его имя, но я не знаю, как это решить. Использование имен (x) интерпретируется как использование имен столбцов каждого фрейма данных. Дополнительный вопрос: это менее критично, но если бы кто-нибудь мог сообщить мне, как я могу добавить вновь созданные фреймы данных, соответствующие «x_dflist_heatmap», в мою среду данных R, это было бы действительно здорово.
Спасибо за вашу помощь!!
Комментарии:
1. Когда вы
lapply
превышаетеdflist
своиx
значения, это фактические данные.фреймы, а не их имена.lapply
не позволяет выполнять итерацию по обоим именам и значениям одновременно.purrr::imap
Функция может помочь, если вам нужно и то, и другое, в противном случае попробуйте выполнить итерацию только по именам и извлечь значения,dflist[[x]]
когда вам нужно значение.2. Я бы также предположил, что если вы хотите сохранить промежуточные фреймы данных
x_dflist_heatmap
, я бы выполнил эту операцию в два этапа: сначала выполните итерацию по исходному списку (или его именам) и создайте список сx_dflist_heatmap
объектами; затем выполните итерацию по ним для создания PDF-файлов.
Ответ №1:
Спасибо вам обоим за ввод! Я думаю, что это более или менее то, что вы предложили, и это работает отлично:
# Load libraries
library(tidyverse)
library(pheatmap)
# Make data frames and combine in list
df1 <- data.frame("Aa" = sample(LETTERS, 5), "Bb" = 1:5, "Cc" = 3:7)
df2 <- data.frame("Aa" = sample(LETTERS, 10), "Dd" = 8:17, "Ee" = 12:21)
dflist <- list(df1, df2)
# Assign names back to data frames in list
names(dflist) <- c("df1", "df2")
# Create vector with the names of the data frames in dflist
dflist_names <- names(dflist)
# Modify the list of data frames for use with pheatmap and save as a new list
dflist_heatmap <- lapply(dflist, function(x){
x <- column_to_rownames(x, var = "Aa")
})
# Create separate pdf file for each data frame, using dflist_heatmap to generate the heatmap and dflist_names to name it
for(i in 1:length(dflist_names)){
pdf(paste0("heatmap_", dflist_names[[i]], ".pdf"))
pheatmap(dflist_heatmap[[i]], scale = "row", main = dflist_names[[i]])
dev.off()
}
Комментарии:
1. Можете ли вы показать это для complexheatmap .. Я хочу знать, как использовать аннотацию столбца
2. @PesKchan, я не уверен, что понял ваш вопрос, но если вы просто хотите сгенерировать вектор, содержащий имена столбцов фрейма данных, вы бы использовали
colnames()
команду. Например, в приведенном выше примереcolnames(df1)
будет получен вектор, содержащий"Aa" "Bb" "Cc"
. Если ваш вопрос более сложный, возможно, стоит опубликовать новый пост?3. Я понял это, но я обязательно спрошу, есть ли у меня какие-то проблемы со сборкой функции, как вы это сделали здесь