Hüsamettin Tayşi
Hüsamettin Tayşi

Reputation: 574

Add dataframes to a list with same date in r

Here is my data;

d1<-structure(list(`1-2006` = structure(c(1.6, 1.6, 1.6, 1.6, 0.208, 
0.405, 0.527, 0.818, 2.2, 3, 2.2, 3, 3, 3, 3, 3.2, 4.6, 5.2), .Names = c("nmaxm5", 
"nmaxm10", "nmaxm15", "nmaxm30", "dmaxm5", "dmaxm10", "dmaxm15", 
"dmaxm30", "maxhourly", "maxh2", "maxh3", "maxh4", "maxh5", "maxh6", 
"maxh8", "maxh12", "maxh18", "maxdaily")), `1-2007` = structure(c(0.8, 
1.4, 2, 3, 2.345, 4.085, 4.884, 4.884, 3.8, 5.2, 5.2, 5.6, 5.6, 
5.6, 5.6, 5.6, 5.6, 5.6), .Names = c("nmaxm5", "nmaxm10", "nmaxm15", 
"nmaxm30", "dmaxm5", "dmaxm10", "dmaxm15", "dmaxm30", "maxhourly", 
"maxh2", "maxh3", "maxh4", "maxh5", "maxh6", "maxh8", "maxh12", 
"maxh18", "maxdaily")), `2-2006` = structure(c(0.8, 1, 1, 1.2, 
0.232, 0.464, 0.691, 1.32, 2.2, 3.2, 4.4, 4.2, 5.8, 5, 6.8, 7.6, 
9, 8.8), .Names = c("nmaxm5", "nmaxm10", "nmaxm15", "nmaxm30", 
"dmaxm5", "dmaxm10", "dmaxm15", "dmaxm30", "maxhourly", "maxh2", 
"maxh3", "maxh4", "maxh5", "maxh6", "maxh8", "maxh12", "maxh18", 
"maxdaily")), `2-2007` = structure(c(0.4, 0.6, 0.8, 1.2, 0.643, 
1.218, 1.577, 3.128, 1.8, 2.4, 2.4, 3.8, 3.8, 3, 3.8, 3.8, 3.8, 
4), .Names = c("nmaxm5", "nmaxm10", "nmaxm15", "nmaxm30", "dmaxm5", 
"dmaxm10", "dmaxm15", "dmaxm30", "maxhourly", "maxh2", "maxh3", 
"maxh4", "maxh5", "maxh6", "maxh8", "maxh12", "maxh18", "maxdaily"
))), .Names = c("1-2006", "1-2007", "2-2006", "2-2007"))

I want to collect dataframes with same months (etc; january, february..) like the data below. There will be 2 dataframes under the list. Same months will be grouped under same list.

    out<-structure(list(january = structure(list(`1-2006` = structure(c(1.6, 
1.6, 1.6, 1.6, 0.208, 0.405, 0.527, 0.818, 2.2, 3, 2.2, 3, 3, 
3, 3, 3.2, 4.6, 5.2), .Names = c("nmaxm5", "nmaxm10", "nmaxm15", 
"nmaxm30", "dmaxm5", "dmaxm10", "dmaxm15", "dmaxm30", "maxhourly", 
"maxh2", "maxh3", "maxh4", "maxh5", "maxh6", "maxh8", "maxh12", 
"maxh18", "maxdaily")), `1-2007` = structure(c(0.8, 1.4, 2, 3, 
2.345, 4.085, 4.884, 4.884, 3.8, 5.2, 5.2, 5.6, 5.6, 5.6, 5.6, 
5.6, 5.6, 5.6), .Names = c("nmaxm5", "nmaxm10", "nmaxm15", "nmaxm30", 
"dmaxm5", "dmaxm10", "dmaxm15", "dmaxm30", "maxhourly", "maxh2", 
"maxh3", "maxh4", "maxh5", "maxh6", "maxh8", "maxh12", "maxh18", 
"maxdaily"))), .Names = c("1-2006", "1-2007")), february = structure(list(
    `2-2006` = structure(c(0.8, 1, 1, 1.2, 0.232, 0.464, 0.691, 
    1.32, 2.2, 3.2, 4.4, 4.2, 5.8, 5, 6.8, 7.6, 9, 8.8), .Names = c("nmaxm5", 
    "nmaxm10", "nmaxm15", "nmaxm30", "dmaxm5", "dmaxm10", "dmaxm15", 
    "dmaxm30", "maxhourly", "maxh2", "maxh3", "maxh4", "maxh5", 
    "maxh6", "maxh8", "maxh12", "maxh18", "maxdaily")), `2-2007` = structure(c(0.4, 
    0.6, 0.8, 1.2, 0.643, 1.218, 1.577, 3.128, 1.8, 2.4, 2.4, 
    3.8, 3.8, 3, 3.8, 3.8, 3.8, 4), .Names = c("nmaxm5", "nmaxm10", 
    "nmaxm15", "nmaxm30", "dmaxm5", "dmaxm10", "dmaxm15", "dmaxm30", 
    "maxhourly", "maxh2", "maxh3", "maxh4", "maxh5", "maxh6", 
    "maxh8", "maxh12", "maxh18", "maxdaily"))), .Names = c("2-2006", 
"2-2007"))), .Names = c("january", "february"))

Upvotes: 1

Views: 37

Answers (1)

Aron Strandberg
Aron Strandberg

Reputation: 3080

Here's how you can do it in one line:

out <- lapply(setNames(1:12, tolower(month.name)), function(x) d1[grepl(paste0("^", x, "-"), names(d1))])

Each month is then accessed as out$january, out$february, etc.

out$january
$`1-2006`
   nmaxm5   nmaxm10   nmaxm15   nmaxm30    dmaxm5   dmaxm10   dmaxm15   dmaxm30 maxhourly     maxh2     maxh3     maxh4     maxh5     maxh6     maxh8    maxh12    maxh18  maxdaily 
    1.600     1.600     1.600     1.600     0.208     0.405     0.527     0.818     2.200     3.000     2.200     3.000     3.000     3.000     3.000     3.200     4.600     5.200 

$`1-2007`
   nmaxm5   nmaxm10   nmaxm15   nmaxm30    dmaxm5   dmaxm10   dmaxm15   dmaxm30 maxhourly     maxh2     maxh3     maxh4     maxh5     maxh6     maxh8    maxh12    maxh18  maxdaily 
    0.800     1.400     2.000     3.000     2.345     4.085     4.884     4.884     3.800     5.200     5.200     5.600     5.600     5.600     5.600     5.600     5.600     5.600 

Upvotes: 3

Related Questions