I have a list of dataframes, all of them with the same column structure (see below for a reproducible part of the data).
The elements of the list are currently named with numbers, while I would like to name them based on the values of the Contrast
column.
list(`1` = structure(list(gene_name = c("EGR1", "FOS", "DUSP6",
"MTND2P12", "PRKG1"), logFC = c(1.76654254980119, 1.17127823620834,
1.15977097733566, -1.0488230301382, -1.14160426859133), AveExpr = c(7.78123576039834,
6.96495213737487, 8.07712204346697, 4.59443820293176, 4.45363638302119
), t = c(5.56926193951565, 4.52588789847687, 4.30658685558903,
-4.03107776879811, -4.01818157353926), P.Value = c(6.26314546243923e-07,
2.88133442317264e-05, 6.1943827508267e-05, 0.000158106269805187,
0.00016507683166428), adj.P.Val = c(0.00269623938482679, 0.0466977246992681,
0.0466977246992681, 0.0466977246992681, 0.0466977246992681),
B = c(4.41885203345315, 0.664723788950823, -0.078687857472298,
-0.984363656764183, -1.02592992743153), Contrast = c("MutA",
"MutA", "MutA", "MutA", "MutA"
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-5L)), `2` = structure(list(gene_name = c("PNRC1", "CSRNP1",
"PRDM1", "NR4A2", "ZNF296", "SOCS3", "PHLDA2", "CCNG2", "ARRDC3",
"ID1", "DUSP2", "PIM1", "CYP1A1"), logFC = c(-1.49102955200986,
1.14224802134131, -1.15585383787062, -1.02735547786377, 1.02035553608404,
1.10716238341174, 1.05166841049116, -1.65132479200427, -2.18654607181093,
1.77429205659587, 1.03869096951995, -1.3820459712131, -1.20297178923705
), AveExpr = c(9.78988310015957, 8.73421574183686, 8.8685535024984,
6.17004098129659, 8.58244317394986, 8.70912817604271, 9.03859024590436,
10.0151710372285, 8.92709742690307, 11.0093922646056, 7.08299475394084,
10.3343119884904, 9.78294465250344), t = c(-10.3415666933288,
8.44909235249311, -7.31863312686932, -7.0503766462354, 6.88254971039145,
6.84255405881957, 6.6661634308286, -6.57689174112265, -6.35937247336919,
6.35842394120948, 6.09678138349739, -6.03753531213675, -5.11987079003073
), P.Value = c(5.50391454309638e-15, 8.06366982837864e-12, 6.93094932192831e-10,
1.99580135073543e-09, 3.86347446361424e-09, 4.52128252255361e-09,
9.03556813379214e-09, 1.28176994232671e-08, 2.99700607586158e-08,
3.0080997621089e-08, 8.30549307278899e-08, 1.04416635223401e-07,
3.36695021239758e-06), adj.P.Val = c(3.31715425597876e-10, 2.42994658443276e-07,
7.96336272855565e-06, 1.71835645153534e-05, 2.91059678059458e-05,
2.98990253865829e-05, 4.95058778050471e-05, 6.06942793274083e-05,
0.000113309477851588, 0.000113309477851588, 0.00025028188100196,
0.000299670770870435, 0.00509840238461601), B = c(22.9513308908157,
15.6316206051317, 11.1774398161111, 10.1226391151815, 9.46458483520333,
9.30802775208554, 8.61902127709979, 8.27132811596184, 7.42752571474613,
7.42385776969362, 6.41653390787626, 6.18977942295351, 2.76361636124891
), Contrast = c("MutB", "MutB", "MutB",
"MutB", "MutB", "MutB", "MutB",
"MutB", "MutB", "MutB", "MutB",
"MutB", "MutB")), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -13L)))
I tried to do it with the following piece of code but it only returns the name of each element and the name of the contrast.
lapply(seq_along(DEGs_list), function(i) (names(DEGs_list)[[i]] <- DEGs_list[[i]]$Contrast[1] ))
Any help will be much appreciated!
CodePudding user response:
I managed to solve it the following way:
list_names <- vector()
for (i in 1:length(DEGs_list)){
list_names[i] <- DEGs_list[[i]]$Contrast[1]
}
DEGs_list <- setNames(DEGs_list,list_names)
I am convinced this might not be the optimal way, so any hints on a better way are welcome.
CodePudding user response:
Here's another way:
names(DEGs_list) <- sapply(DEGs_list, \(x) x$Contrast[1])
CodePudding user response:
Assuming, that Contrast
column has only single value, than this might work:
names(ls) = unlist(lapply(ls, function(x) unique(x$Contrast))
CodePudding user response:
A purrr
way with set_names()
function:
library(dplyr)
library(purrr)
names <- df %>% map(~ .x %>% pull(Contrast) %>% unique)
df %>%
set_names(names)