在R中统一命名num的列表

在R中统一命名num的列表,r,list,dataframe,R,List,Dataframe,我面临的问题是,经过一些计算后,我的结果格式混乱。我每季度计算两个不同的值,并将每个值存储在列表中,如以下输出所示: $`2015` 1 2 3 4 158.4567 165.7833 153.1233 140.8067 $`2016` 1 2 3 4 140.4833 149.9200 157.9233 161.2467 我以前的解决方案以类似appendvalue1、value2

我面临的问题是,经过一些计算后,我的结果格式混乱。我每季度计算两个不同的值,并将每个值存储在列表中,如以下输出所示:

$`2015`
   1        2        3        4 
158.4567 165.7833 153.1233 140.8067 

$`2016`
       1        2        3        4 
140.4833 149.9200 157.9233 161.2467
我以前的解决方案以类似appendvalue1、value2的形式结束,它为我提供了以下非必需的输出:

$`2015`
   1        2        3        4        1        2        3        4 
158.4567 165.7833 153.1233 140.8067 151.5633 155.2667 132.4667 128.4633 

$`2016`
       1        2        3        4        1        2        3        4 
140.4833 149.9200 157.9233 161.2467 127.8667 144.3600 150.8467 152.5333
我无法找到将这三个列表合并为一个列表或数据帧的方法,该列表或数据帧可能类似于:

date   value1     value2
2015.1 158.4567   151.5633
2015.2 165.7833   155.2667
2015.3 153.1233   132.4667
2015.4 140.8067   128.4633
2016.1 ...        ...
2016.2 ...        ...
2016.3 ...        ...
2016.4 ...        ...
编辑: 创建要在数据帧中合并的两个值的示例代码:

library(lubridate) # for date operations

# manual created dataframe
date <- sample(seq(as.Date('1999-01-01 00:00:00'), as.Date('2017-01-01 00:00:00'), by="day"), 500)
dataM = data.frame("first" = 1:500, "sec" = c(1:500), "date"=date)

dataM <- transform(dataM, date = ymd(dataM$date)) # date to lubridate date format

  splitByYear = split(dataM, year(dataM$date))
  splitByQuarter = sapply(splitByYear, function(y) split(y, quarter(y$date)))

  a = sapply(splitByQuarter, function(x) sapply(x, function(y) max(y$date, na.rm = TRUE)))
  b = sapply(splitByQuarter, function(x) sapply(x, function(y) min(y$sec, na.rm = TRUE)))


  res = mapply(quarterPP, a,b)
  res

  quarterPP <- function(a, b){
    value1 = a+b
    value2 = b+1900

    c(value1, value2) # this should be in a dataframe
}

一种方法是使用矩阵并从dplyr绑定_行


如果将所有列表合并为一个列表,则可以使用purrr::map_df迭代并将结果强制为data.frame:

图书馆管理员 第47集 l1%并将两个元素强制为具有名称列的data.frame spreadvar、val最终将形状重塑为宽形状 >一个tibble:12×4 >年度季度l1 l2 > * > 1 2015 1 1.99469634 0.49382018 > 2 2015 2 0.71114251 -1.82822917 > 3 2015 3 0.18540528 0.09147291 > 4 2015 4 -0.28176501 0.67077922 > 5 2016 1 0.10877555 -0.08107805 > 6 2016 2 -1.08573747 1.26424109 > 7 2016 3 -0.98548216 -0.70338819 > 8 2016 4 0.01513086 -0.04057817 > 9 2017 1 -0.25204590 -1.56616208 > 10 2017 2 -1.46575030 0.24914817 > 11 2017 3 -0.92245624 -0.34041599 > 12 2017 4 0.03960243 0.41719084
对于我的数据,我得到以下错误:变量的长度必须为1或1。问题变量:“四分之一”来自数据框,可能告诉您一些数据没有您的示例所示的名称,或者是空的。您可以使用quarter=seq_沿着.x重新计算quarter,但这是假设向量总是有序的,并且只包含四个值,这两个值都可能为false。要获得更好的答案,请使用调用dput的结果编辑您的问题。。。你的答案对我很有用。但我有一个问题,如果在开始时,例如第一个季度缺失,我有所有4个季度的NA值。你是什么意思?您能用提供的数据演示一个示例吗?我添加了一些示例代码。你的第二种可能性看起来也不错。它只适用于一个值,目前我正在尝试为两个或多个值实现此解决方案
#create dummy data
x <- setNames(rnorm(4), 1:4)
y <- setNames(rnorm(4), 1:4)
z <- setNames(rnorm(4), 1:4)
w <- setNames(rnorm(4), 1:4)
l1 <- list(`2015` = append(x, y), `2016` = append(z, w))

l1
#$`2015`
#         1          2          3          4          1          2          3           4 
#-0.0318981 -1.1241606 -0.1040653 -0.7819973 -0.8715601 -0.2287638 -0.9092943  -0.3757804 

#$`2016`
#         1          2          3          4          1          2          3           4 
#-0.6034540 -1.1469930  0.6085236  1.2565788 -0.1020582  0.1383716  1.1358109  -0.2635427 


l2 <- lapply(l1,function(i) { 
                  ind <- max(as.numeric(names(i))); 
                  data.frame(matrix(i, nrow = ind))
               })

final_df <- dplyr::bind_rows(l2, .id = 'Year')
final_df$Year <- make.unique(final_df$Year)

final_df
#    Year         V1         V2
#1   2015 -0.0318981 -0.8715601
#2 2015.1 -1.1241606 -0.2287638
#3 2015.2 -0.1040653 -0.9092943
#4 2015.3 -0.7819973 -0.3757804
#5   2016 -0.6034540 -0.1020582
#6 2016.1 -1.1469930  0.1383716
#7 2016.2  0.6085236  1.1358109
#8 2016.3  1.2565788 -0.2635427
l2 <- lapply(l1, function(i)setNames(tidyr::spread(transform(stack(i), grp=cumsum(ind == 1)), 
                          grp, values), c('ind', paste0('Value', 1:ceiling(length(i)/4)))))

bind_rows(l2, .id = 'Year')