2016-07-08 3 views
1

私は、行が等しくないデータフレームのリストを持っています。私はすべてのデータフレームにNAを生成して、その中に同じ数の行がないようにしたいと思います。等しくない行を持つデータフレームのリストでNAを生成する方法

l=list(data.frame(a=1:5,b=4:8), data.frame(a=1:10,b=11:20)) 
m=max(sapply(l, nrow)) 

これは長さではありますが、行では機能しません。

lapply(l, function(x) { nrow(x) <- m }) 
+0

'lapply(l、function(x)as.data.frame(rbind as.matrix(x)、matrix(data = NA、nrow =(m-nrow(x))、ncol = ncol )) ' – N8TRO

答えて

5

あなたがdata.frame(または他のベクター)で、既存の何よりも多くの行を抽出した場合、彼らはデフォルトでNAで満たされることになるので、あなたは[.data.frameを使ってこれを行うことができます。

lapply(l, function(x) x[seq_len(m),]) 

それとも、その後row.namesをリセットする場合:限り、あなたがいないよう

x <- 1:5 
x[1:10] 
# [1] 1 2 3 4 5 NA NA NA NA NA 
+0

今は単純なようです。ありがとう。 –

1

lapply(l, function(x){ x <- x[seq_len(m),]; row.names(x) <- NULL; x}) 

を述べたように、同じことが簡単なベクターで起こります本当に大量のリストを持っていると、forループもここでうまくいくので、読みやすくなります:

l <- list(data.frame(a=1:5,b=4:8), data.frame(a=1:10,b=11:20)) 
m <- max(sapply(l, nrow)) 

for (i in seq_along(l)) { 
    entry <- l[[1]] 

    # skip entry if no rows need to be added 
    if (nrow(entry) == m) { 
     next 
    } 

    # otherwise add NA rows 
    rows_to_add <- matrix(rep(NA, (m - nrow(entry)) * ncol(entry)), 
          ncol=ncol(entry)) 
    colnames(rows_to_add) <- colnames(entry) 

    l[[i]] <- rbind(entry, rows_to_add) 
} 
+0

コードの読みやすさの面でより優れた機能を適用したいと考えています。ありがとう。 –

+0

@docendodiscimusこの場合、NAsの行列( 'rows_to_add')は' rbind'を呼び出すと 'data.frame'に強制されるので、data.frameの要素には影響しないはずです。 –

関連する問題