2017-03-24 44 views
1

我有这样一个清单:转换在数据帧中的列表中的所有列,以时间序列

df1 <- data.frame(var1 = 1:5, var2 = 6:10) 
rownames(df1) <- 2001:2005 
df2 <- data.frame(var5 = 21:25, var6 = 26:30) 
rownames(df2) <- 2006:2010 
mylist <- list(df1,df2) 

> mylist 
[[1]] 
    var1 var2 
2001 1 6 
2002 2 7 
2003 3 8 
2004 4 9 
2005 5 10 

[[2]] 
    var5 var6 
2006 21 26 
2007 22 27 
2008 23 28 
2009 24 29 
2010 25 30 

如何可以将每个数据帧的时间序列,其中起始和结束中每列由分钟给出和各个数据帧的rownames的最大值?

我想:

lapply(mylist, function(x) {apply(x, 2, function(y) ts(y, start = min(rownames(y), end = max(rownames(y)))))}) 

导致:

Error in if (nobs != ndata) data <- if (NCOL(data) == 1) { : 
    missing value where TRUE/FALSE needed 

,但未能作出的任何意义。

+0

我想你忘记后'开始=分钟(rownames(Y)'关闭托架。 尝试'lapply(MYLIST,函数(X){申请(x,2,function(y)ts(y,start = min(rownames(y)),end = max(rownames(y))))})'。 我不确定,但可能在'max'和'min'函数中,你应该使用'as.numeric(rownames(y))'。因为'rownames(y)'会给你一些字符串,而R无法计算字符串的最小或最大值。 – Smich7

回答

3

我们可以通过循环使用的列而不是lapplyapplyapply输出是matrix,所有的类丢失做到这一点。此外,min/max作品上numeric/integer元素,所以最好是在characterrow.names转换为numeric

lst1 <- lapply(mylist, function(x) lapply(x, function(y) ts(y, 
     start = min(as.numeric(row.names(x))), end = max(as.numeric(row.names(x)))))) 
lst1[[1]][[1]] 
#Time Series: 
#Start = 2001 
#End = 2005 
#Frequency = 1 
#[1] 1 2 3 4 5 

如果我们需要创建ts栏目,然后分配输出回数据。框架保持结构如前

lst2 <- lapply(mylist, function(x) { 
     x[] <- lapply(x, function(y) ts(y, start = min(as.numeric(row.names(x))), 
        end = max(as.numeric(row.names(x))))) 
     x}) 
str(lst2) 
#List of 2 
#$ :'data.frame':  5 obs. of 2 variables: 
# ..$ var1: Time-Series [1:5] from 2001 to 2005: 1 2 3 4 5 
# ..$ var2: Time-Series [1:5] from 2001 to 2005: 6 7 8 9 10 
#$ :'data.frame':  5 obs. of 2 variables: 
# ..$ var5: Time-Series [1:5] from 2006 to 2010: 21 22 23 24 25 
# ..$ var6: Time-Series [1:5] from 2006 to 2010: 26 27 28 29 30 
+1

谢谢,是否有可能避免创建子列表?我想保留一个数据框列表,每列有一列数据框 – beetroot

+0

@beetroot你可以用'xts'来做,也就是'lst3 < - lapply(mylist,function(x)xts(x,order.by = as.Date(sprintf(“%s-01-01”,row.names(x))))); class(lst3 [[1]])# [1]“xts”“zoo”' – akrun

+1

是的,整个问题都非常愚蠢,因为我不需要按列做任何事情。我很困惑;)无论如何,谢谢 – beetroot