簡體   English   中英

從現有數據框列表創建新的數據框列表

[英]Create a new list of data frames from an existing list of data frames

d1 <- data.frame(id = c("a", "b", "c"), val = c(111, 444, 777), month = c( "jan", "Jan" , "jan" ))
d2 <- data.frame(id = c("a", "b", "c"), val = c(222, 555, 888), month = c( "feb", "feb" , "feb" ))
d3 <- data.frame(id = c("a", "b", "c"), val = c(333, 666, 999), month = c( "mar", "mar" , "mar" ))

old.list <- list(d1, d2, d3)


s1 <- data.frame(id = c("a", "a", "a"), val = c(111, 222, 333), month = c( "jan", "feb" , "mar" ))
s2 <- data.frame(id = c("b", "b", "b"), val = c(444, 555, 666), month = c( "Jan", "feb" , "mar" ))
s3 <- data.frame(id = c("c", "c", "c"), val = c(777, 888, 999), month = c( "Jan", "feb" , "mar" ))

new.list <- list(s1, s2, s3)

'old.list' 中的所有數據框都具有相同的大小和相同的唯一 ID。 我正在嘗試將“old.list”轉換為每個唯一 ID 的時間序列,其中“月”是時間戳,即“new.list”,而不使用 for 循環。

附加說明,“old.list”中每個數據框的第 n 行被組合起來為“new.list”創建新的數據框,提前致謝。

在基礎 R 中,您可以rbind列表元素並按 id split

new.list <- do.call(rbind, old.list)
new.list <- split(new.list, new.list$id)

假設你所有的系列在一月份開始,這應該有效:

(如果不查看 ts 的開始參數)

d1 <- data.frame(id = c("a", "b", "c"), val = c(111, 444, 777), month = c( "jan", "Jan" , "jan" ))
d2 <- data.frame(id = c("a", "b", "c"), val = c(222, 555, 888), month = c( "feb", "feb" , "feb" ))
d3 <- data.frame(id = c("a", "b", "c"), val = c(333, 666, 999), month = c( "mar", "mar" , "mar" ))

old.list <- list(d1, d2, d3)

d <- Reduce(rbind,old.list)
d <- split(d$val, d$id)

lapply(d, ts, frequency = 12)
#> $a
#>   Jan Feb Mar
#> 1 111 222 333
#> 
#> $b
#>   Jan Feb Mar
#> 1 444 555 666
#> 
#> $c
#>   Jan Feb Mar
#> 1 777 888 999

代表 package (v0.3.0) 於 2021 年 3 月 12 日創建

這是一個tidyverse方法:

d1 <- data.frame(id = c("a", "b", "c"), val = c(111, 444, 777), month = c( "jan", "Jan" , "jan" ))
d2 <- data.frame(id = c("a", "b", "c"), val = c(222, 555, 888), month = c( "feb", "feb" , "feb" ))
d3 <- data.frame(id = c("a", "b", "c"), val = c(333, 666, 999), month = c( "mar", "mar" , "mar" ))

old.list <- list(d1, d2, d3)

library(dplyr)
library(purrr)

old.list %>% 
  reduce(rbind, by = 'id') %>% 
  filter(id != 'id') %>% 
  group_split(id)


#> [[1]]
#> # A tibble: 3 x 3
#>   id    val   month
#>   <chr> <chr> <chr>
#> 1 a     111   jan  
#> 2 a     222   feb  
#> 3 a     333   mar  
#> 
#> [[2]]
#> # A tibble: 3 x 3
#>   id    val   month
#>   <chr> <chr> <chr>
#> 1 b     444   Jan  
#> 2 b     555   feb  
#> 3 b     666   mar  
#> 
#> [[3]]
#> # A tibble: 3 x 3
#>   id    val   month
#>   <chr> <chr> <chr>
#> 1 c     777   jan  
#> 2 c     888   feb  
#> 3 c     999   mar

代表 package (v0.3.0) 於 2021 年 3 月 12 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM