2017-03-24 8 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

以前のような構造を維持するためのフレーム。 は機能、マイリスト(lapply '試してみてください(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

applyの出力がmatrixであり、すべてのクラスが失われると私たちはlapply代わりのapplyを使用して列をループすることにより、これを行うことができます。また、numeric/integer要素にmin/max作品、私たちが戻ってデータへの出力を割り当て、その後、カラムとしてtsを作成する必要がある場合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 

row.namescharacterクラスを変換することをお勧めしますので。私はあなたが `` =分(rownames(y)を開始した後、ブラケットを閉じるのを忘れて考える

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

ありがとうございます。サブリストが作成されないようにすることはできますか? 1つの列につき1列のデータフレームのリストを持つ構造を維持したいと考えています。 – beetroot

+0

@beetroot 'xts'でできることは、' lst3 < - lapply(mylist、function(x)xts(x、order.by = as.Date(sprintf( "%s-01-01"、row.names(x))))); # [1] "xts" "zoo" ' – akrun

+1

私は列で何もする必要がないので、質問全体がかなりばかげていました。私は混乱していた;)とにかくおかげで – beetroot

関連する問題