2016-08-03 8 views
1

データフレームの別のリストを持つリストを得ました。 外部リスト要素は年を表し、内部リストは月データを表します。特定の方法でリストのデータフレームのリストを結合する

今、すべての月のデータを含む最終的なリストを作成したいと思います。各月の列は、他の年の列の値によって「cbinded」されます。私はforループとその少し複雑なを使用してみました

enter image description here

を以下のよう

Alldata <- list() 

Alldata[[1]] <- list(data.frame(Jan_2015_A=c(1,2), Jan_2015_B=c(3,4)), data.frame(Feb_2015_C=c(5,6), Feb_2015_D=c(7,8))) 
Alldata[[2]] <- list(data.frame(Jan_2016_A=c(1,2), Jan_2016_B=c(3,4)), data.frame(Feb_2016_C=c(5,6), Feb_2016_D=c(7,8))) 

期待される出力リストがあり、私は任意のR関数は、この作業をしたいです。

私は以下のコードを使ってforループを使ってこれを行っています。しかし、これは本当に複雑で、私はこの少し複雑に思った。この操作のための簡単できれいなコードが得られることを願っています。

私はあなたが以下の次の操作を行うことができ

x2 <- list() 

for(l1 in 1: length(Alldata[[1]])){ 
    temp <- list() 
    for(l2 in 1: length(Alldata)){ 


    temp <- append(temp, list(Alldata[[l2]][[l1]])) 

    } 

    x2 <- append(x2, list(temp)) 
} 

# then created final List with succesive years data of each month as list items. This is primarily used for Tracking data for years For Example: how much was count was for Jan_2015 and Jan_2016 for "A" 
finalList <- list() 
for(l3 in 1: length(x2)){ 

    temp <- x2[[l3]] 
    td2 <- as.data.frame(matrix("", nrow = nrow(temp[[1]]))) 
    rownames(td2)[rownames(temp[[1]])!=""] <- rownames(temp[[1]])[rownames(temp[[1]])!=""] 
    for(l4 in 1:ncol(temp[[1]])){ 
    for(l5 in 1: length(temp)){ 

     # lapply(l4, function(x) do.call(cbind, 
     td2 <- cbind(td2, temp[[l5]][, l4, drop=F]) 
    } 

    } 

    finalList <- append(finalList, list(td2)) 

} 

> finalList 
[[1]] 
    V1 Jan_2015_A Jan_2016_A Jan_2015_B Jan_2016_B 
1    1   1   3   3 
2    2   2   4   4 

[[2]] 
    V1 Feb_2015_C Feb_2016_C Feb_2015_D Feb_2016_D 
1    5   5   7   7 
2    6   6   8   8 
+0

あなたはこれまでにどのようなコードを書いていますか? –

+0

@C_Z_ forループを使用して私のコードで更新された質問を参照してください。 –

答えて

2

データフレームの形式でリスト項目として各月と年のデータでリストを作成しました。 lapplyは外側のリストを反復処理し、do.callcbindのデータフレームの内側のリストになります。

lapply(Alldata, do.call, what = 'cbind') 
[[1]] 
    Jan_2015_A Jan_2015_B Feb_2015_C Feb_2015_D 
1   1   3   5   7 
2   2   4   6   8 

[[2]] 
    Jan_2016_A Jan_2016_B Feb_2016_C Feb_2016_D 
1   1   3   5   7 
2   2   4   6   8 

dplyrを使用しても同じ結果が得られます。ここ

library(dplyr) 
lapply(Alldata, bind_cols) 

がOPから清澄化後JR

lapply(Alldata, Reduce, f = cbind) 

EDIT

によって提案された第三の選択肢である、上記の溶液は、新たに指定された出力を生成する(下記参照)変更されています。上記のソリューションは、以下のソリューションのビルディングブロックであるため、そこに残されています。

pattern.vec <- c("Jan", "Feb") 
### For a given vector of months/patterns, returns a 
### list of elements with only that month. 
mon_data <- function(mo) { 
    return(bind_cols(sapply(Alldata, function(x) { x[grep(pattern = mo, x)]}))) 
} 
### Loop through months/patterns. 
finalList <- lapply(pattern.vec, mon_data) 
finalList 

## [[1]] 
## Jan_2015_A Jan_2015_B Jan_2016_A Jan_2016_B 
## 1   1   3   1   3 
## 2   2   4   2   4 
## 
## [[2]] 
## Feb_2015_C Feb_2015_D Feb_2016_C Feb_2016_D 
## 1   5   7   5   7 
## 2   6   8   6   8 

## Ordering the columns as specified in the original question. 
## sorting is by the last character in the column name (A or B) 
## and then the year. 
lapply(finalList, function(x) x[ order(gsub('[^_]+_([^_]+)_(.*)', '\\2_\\1', colnames(x))) ]) 
## [[1]] 
## Jan_2015_A Jan_2016_A Jan_2015_B Jan_2016_B 
## 1   1   1   3   3 
## 2   2   2   4   4 
## 
## [[2]] 
## Feb_2015_C Feb_2016_C Feb_2015_D Feb_2016_D 
## 1   5   5   7   7 
## 2   6   6   8   8 
+1

nice、または 'lapply(Alldata、Reduce、f = cbind)'を使って減らすことができます。 –

+0

@ J.R。代替のおかげで。私はあなたが答え、あなたの呼び出しとしてそれを提供することを計画していない場合、私は私の答えにそれを加えることができます。 – steveb

+0

先に進んで追加してください:) –

関連する問題