How to get the name of a data.frame within a list?
Solution 1
I'd use the names of the list in this fashion:
dat1 = data.frame()
dat2 = data.frame()
l = list(dat1 = dat1, dat2 = dat2)
> str(l)
List of 2
$ dat1:'data.frame': 0 obs. of 0 variables
$ dat2:'data.frame': 0 obs. of 0 variables
and then use lapply + ddply like:
lapply(names(l), function(x) {
ddply(l[[x]], c("idx", x), summarise,checkSum = sum(value))
})
This remains untested without a reproducible answer. But it should help you in the right direction.
EDIT (ran2): Here's the code using the reproducible example.
l <- lapply(names(mylist), function(x) {
ddply(mylist[[x]], c("idx", x), summarise,checkSum = sum(value))
})
names(l) <- names(mylist); l
Solution 2
Here is the dplyr equivalent
library(dplyr)
catalog =
data_frame(
data = someListOfDataframes,
cat = names(someListOfDataframes)) %>%
rowwise %>%
mutate(
renamed =
data %>%
rename_(.dots =
cat %>%
as.name %>%
list %>%
setNames("cat")) %>%
list)
catalog$renamed %>%
bind_rows(.id = "number") %>%
group_by(number, idx, cat) %>%
summarize(checkSum = sum(value))
Solution 3
you could just firstly use names(list)->list_name and then use list_name[1] , list_name[2] etc. to get each list name. (you may also need as.numeric(list_name[x]) if your list names are numbers.
Matt Bannert
Data Science and Analytics Engineer Engineer. Global coordinator for @_useRconf. Creator of Hacking for Social Sciences. Talks stats, hoops and trash.
Updated on October 09, 2020Comments
-
Matt Bannert over 3 years
How can I get a data frame's name from a list? Sure,
get()
gets the object itself, but I want to have its name for use within another function. Here's the use case, in case you would rather suggest a work around:lapply(somelistOfDataframes, function(X) { ddply(X, .(idx, bynameofX), summarise, checkSum = sum(value)) })
There is a column in each data frame that goes by the same name as the data frame within the list. How can I get this name
bynameofX
?names(X)
would return the whole vector.EDIT: Here's a reproducible example:
df1 <- data.frame(value = rnorm(100), cat = c(rep(1,50), rep(2,50)), idx = rep(letters[1:4],25)) df2 <- data.frame(value = rnorm(100,8), cat2 = c(rep(1,50), rep(2,50)), idx = rep(letters[1:4],25)) mylist <- list(cat = df1, cat2 = df2) lapply(mylist, head, 5)
-
baptiste over 12 years
llply(mylist, .fun=ddply, c(2,3), summarize, checkSum=sum(value))
works as well, but may be more confusing -
baptiste over 12 years@ran2 I don't think so because the names to use vary from list to list.
-
baxx over 4 yearsthis doesn't work unless the list had the names given in the first place