#r #list #dataframe #export #lapply
#r #Список #фрейм данных #экспорт #lapply
Вопрос:
Я хочу экспортировать все фреймы данных из моего списка из 3 списков в отдельные '.txt'
файлы. У меня есть список ‘my_list’, содержащий 3 списка (list1, list2 и list3).
Каждый список содержит несколько фреймов данных. Я хочу экспортировать все dataframes
для 3 списков в отдельные файлы ( r1_df1.txt
, r1_df2.txt
, r2_df3.txt
, r2_df4.txt
r2_df5.txt
, r3_df6.txt
r3_df7.txt
, r3_df8.txt
,,,,,,,,,,,,,,,,,,,)
Давайте создадим несколько фреймов данных:
df1 <- data.frame(geneName = 1:3, EnsemblID = 4:6, position = c(654654654,654654,654654))
df2 <- data.frame(id = 1:3, sex = c("M", "F", "T"))
df3 <- data1 <- data.frame(x1 = 1:3, x2 = letters[1:3])
df4 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
df5 <- data.frame(geneName = 1:3, EnsemblID = 4:6, position = c(65465,654654,987987))
df6 <- data.frame(id = 1:3, sex = c("C", "S", "T"))
df7 <- data1 <- data.frame(x1 = 1:3, x2 = letters[1:3])
df8 <- data.frame(z1 = c(3, 45, 1), p2 = c(6, 5, 4))
фреймы данных в списке
list1 <- list(df1, df2); names(list1) <- c("df1", "df2")
list2 <- list(df3,df4,df5); names(list2) <- c("df3", "df4", "df5")
list3 <- list(df6, df7, df8); names(list3) <- c("df6", "df7", "df8")
my_list содержит 3 списка
my_list <- list(list1, list2, list3); names(my_list) <- c("r1", "r2", "r3")
Экспортировать фреймы данных в отдельные .txt
файлы**
для одного списка я использую этот код
lapply(seq_along(list1),
function(i) write.table(list1[[i]],
paste0("r1_", names(list1)[i] , ".txt"),
row.names = FALSE, quote = FALSE, sep = "t", dec = ","))
## r1_df1.txt
## r1_df2.txt
Как я могу сделать то же самое для всех списков сразу?
Я попробовал цикл for
for (i in seq_along(my_list)) {
filename = paste("r_", names(my_list)[i], ".txt")
write.table(my_list[[i]], filename, row.names = FALSE, quote = FALSE, sep = "t", dec = "," )
}
Я получаю 3 файла, каждый из которых содержит привязанные фреймы данных, а не отдельные фреймы данных.
Ответ №1:
Было бы проще сделать это, если бы вы одновременно перебирали имена и данные.
Попробуйте это с purrr
:
library(purrr)
imap(my_list, function(x, y) imap(x,
~write.table(.x, paste0(y, '_', .y , ".txt"),
row.names = FALSE, quote = FALSE, sep = "t", dec = ",")))
Или, если вы хотите сохранить данные в базовом R :
Map(function(x, y) {
Map(function(p, q) {
write.table(p, paste0(y, '_', q , ".txt"),
row.names = FALSE, quote = FALSE, sep = "t", dec = ",")
}, x, names(x))
}, my_list, names(my_list))
Комментарии:
1. спасибо за быстрый ответ. В моих списках несколько раз встречаются одни и те же имена фреймов данных. Как я могу заменить «r1_» именами подсписок . Пример, чтобы получить
r1_df1
,r1_df2
r2_df3
,r2_df4
r2_df5
,r3_df6
r3_df7
,,,,,,,,,,,,,,,r3_df8
Ответ №2:
Возможно, вы захотите unlist
не рекурсивно заранее.
my_list.u <- unlist(my_list, recursive=F)
for (i in seq_along(my_list.u)) {
filename=paste0("r_", names(my_list.u)[i], ".txt")
write.table(my_list.u[[i]], filename, row.names=FALSE, quote=FALSE,
sep="t", dec="," )
}
Или без for
использования цикла sapply
, что примерно на 20% быстрее.
sapply(seq(my_list.u), function(x)
write.table(my_list.u[[x]], paste0(names(my_list.u)[x], ".txt"),
row.names=FALSE, quote=FALSE, sep="t", dec=","))