2016-07-15 1 views
0

これは、あるポリゴンの土地利用を計算する、私のfor-loop in Rの(意味のない)切り詰め版です。 plyr::rbind.fill()を使用して計算をdata.frameにバインドする必要がある場合を除いて、データをうまく反復処理します。私は望みの結果を得るだけでなく、(同じ数の)不要な列をNA値で埋めます(私は列名と関係があると思います)。forループへのdata.frameへのリストバインド

agri_coverage <- data.frame(matrix(rnorm(3), nrow=1)) 
set.seed(23) 
agri <- rnorm(10, 0.5) 

land_use <- NULL 
for (i in seq_along(agri)) { 
name <- agri[i] 
if (name > 1) { 
    wl <- as.list(unlist(agri_coverage[ ,1:3])) 
    } else { 
    wl <- as.list(rep(NA, 3)) 
    } 
    land_use <- rbind.fill(land_use, data.frame(wl)) #combine output 
} 

これらのリストを1つのデータフレームにまとめて、なぜこれらの追加の列が作成されるのが最適な機能/方法ですか?

私はrbind(),data.table::rbindlist()のような他の機能を成功させることなく試しました。

+2

'rbind.fill'(およびその後継の' bind_rows')は、同じnaあなたの「NA」には名前がありません。 'else'を' wl < - as.list(setNames(rep(NA、3)、names(agri_coverage))) ')に変更すると、うまくいきます。より典型的な基本的なアプローチは 'do.call(rbind、lapply(agri、function(x){if(x> 1){agri_coverage} else {rep(NA、3)}}))' – alistaire

+0

私は方法を考えていた複雑になる。説明をありがとう! – andrasz

答えて

1

あなたのelse条件で作成されたリストが、ifの条件と同じ名前になっていないという理由で、不要な列がNAsでいっぱいになってしまう理由があります。 rbind.fillは、同じ名前の列をお互いに追加し、異なる名前を持つ列はすべてNAで埋められます。 rbind.fill help:

rbinds欠落した列にNAを埋め込むリストです。

私はあなたが単にあなたのelse条件の末尾に次の行を追加することができ、あなたが希望する結果を取得すると思う:その後、

names(wl) <- names(agri_coverage) 

コードは次のようになります。

になり
land_use <- NULL 
for (i in seq_along(agri)) { 
    name <- agri[i] 
    if (name > 1) { 
    wl <- as.list(unlist(agri_coverage[ ,1:3])) 
    } else { 
    wl <- as.list(rep(NA, 3)) 
    names(wl) <- names(agri_coverage) 
    } 
    land_use <- rbind.fill(land_use, data.frame(wl)) #combine output 
} 

land_use 
      X1  X2   X3 
1   NA  NA   NA 
2   NA  NA   NA 
3 0.2182885 -1.046535 -0.2886886 
4 0.2182885 -1.046535 -0.2886886 
5 0.2182885 -1.046535 -0.2886886 
6 0.2182885 -1.046535 -0.2886886 
7   NA  NA   NA 
8 0.2182885 -1.046535 -0.2886886 
9   NA  NA   NA 
10 0.2182885 -1.046535 -0.2886886 
関連する問題