在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')