web-dev-qa-db-ja.com

Rの空のデータフレームに列を追加する

私は広範囲にわたって検索しましたが、Stack Overflowでこの質問に対する回答が見つかりませんでした。

データフレームがあるとしましょうa。

私は定義します:

a <- NULL
a <- as.data.frame(a)

このデータフレームに列を追加したい場合:

a$col1 <- c(1,2,3)

次のエラーが発生します。

Error in `$<-.data.frame`(`*tmp*`, "a", value = c(1, 2, 3)) : 
    replacement has 3 rows, data has 0

行の次元は固定されているのに列は固定されていないのはなぜですか?

データフレームの行数を変更するにはどうすればよいですか?

これを行うと(最初にデータをリストに入力してから、dfに変換します)、正常に機能します。

a <- NULL
a$col1 <- c(1,2,3)
a <- as.data.frame(a)
20
Michal

行の次元は固定されていませんが、data.framesは、同じ長さに制限されているベクトルのリストとして保存されます。 _col1_には3つの値(行)があり、aにはゼロがあるため、_col1_をaに追加することはできません。 data.frameよりも長い列を追加してdata.frameの次元を拡張しようとした場合、Rはデフォルトで値を自動有効化しません。 2番目の例が機能する理由は、_col1_がdata.frame内の唯一のベクトルであるため、data.frameが3行で初期化されるためです。

Data.frameを自動的に展開する場合は、次の関数を使用できます。

_cbind.all <- function (...) 
{
    nm <- list(...)
    nm <- lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow))
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - 
        nrow(x), ncol(x)))))
}
_

これにより、欠損値がNAで埋められます。そして、あなたはそれを次のように使います:cbind.all( df, a )

10
ctbrown

複数のファイルからデータを読み取り、必要な列を取得してデータフレームに格納する、というようなこともできます。データフレームに何かがあるかどうかを確認し、ない場合は、行数の不一致に関するエラーを取得するのではなく、新しいデータフレームを作成します。

readCounts = data.frame()

for(f in names(files)){
    d = read.table(files[f], header=T, as.is=T)
    d2 = round(data.frame(d$NumReads))
    colnames(d2) = f
    if(ncol(readCounts) == 0){
        readCounts = d2
        rownames(readCounts) = d$Name
    } else{
        readCounts = cbind(readCounts, d2)
    }
}
1
user2820516