user1491868
user1491868

Reputation: 326

R Make Nested List From Data.Frame

Using R base, I would like to convert a data.frame into a nested list while keeping the name of the data unchanged. Below is my sample code. Thank you.

#I WOULD LIKE TO SIMPLIFY THIS PROCESS
DF <- expand.grid(NAME = c("FRANK", "TONY", "ED"), DATE = seq(as.Date("2014-01-01"), as.Date("2017-12-31"), by = "day"), NUM = c(1:3))
DF <- list(
    lapply(2014:2015, function(t) DF[with(DF, as.Date(paste(t, "01", "01", sep = "-")) <= DATE & DATE <= as.Date(paste(t + 1, "06", "30", sep = "-"))), ]),
    lapply(2014:2015, function(t) DF[with(DF, as.Date(paste(t, "01", "01", sep = "-")) <= DATE & DATE <= as.Date(paste(t + 2, "06", "30", sep = "-"))), ]),
    lapply(2014:2015, function(t) DF[with(DF, as.Date(paste(t, "01", "01", sep = "-")) <= DATE & DATE <= as.Date(paste(t + 3, "06", "30", sep = "-"))), ])
)

#BUT THIS DOES NOT WORK
DF <- expand.grid(NAME = c("FRANK", "TONY", "ED"), DATE = seq(as.Date("2014-01-01"), as.Date("2017-12-31"), by = "day"), NUM = c(1:3))
DF <- lapply(1:3, function(i) DF[[i]] <- lapply(2014:2015, function(t) DF[with(DF, as.Date(paste(t, "01", "01", sep = "-")) <= DATE & DATE <= as.Date(paste(t + i, "06", "30", sep = "-"))),]))

#YET THIS WORKS WITH A NEW NAME
DF <- expand.grid(NAME = c("FRANK", "TONY", "ED"), DATE = seq(as.Date("2014-01-01"), as.Date("2017-12-31"), by = "day"), NUM = c(1:3))
DF.NEW <- list()
DF.NEW <- lapply(1:3, function(i) DF.NEW[[i]] <- lapply(2014:2015, function(t) DF[with(DF, as.Date(paste(t, "01", "01", sep = "-")) <= DATE & DATE <= as.Date(paste(t + i, "06", "30", sep = "-"))),]))

Upvotes: 1

Views: 362

Answers (1)

Rui Barradas
Rui Barradas

Reputation: 76673

You don't need DF.NEW nor DF[[i]] <- lapply(...). Just do

DF <- lapply(1:3, function(i)
    lapply(2014:2015, function(t)
    DF[with(DF, as.Date(paste(t, "01", "01", sep = "-")) <= DATE & DATE <=   as.Date(paste(t + i, "06", "30", sep = "-"))),]))

Upvotes: 3

Related Questions