私は広範囲にわたって検索しましたが、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)
行の次元は固定されていませんが、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 )
複数のファイルからデータを読み取り、必要な列を取得してデータフレームに格納する、というようなこともできます。データフレームに何かがあるかどうかを確認し、ない場合は、行数の不一致に関するエラーを取得するのではなく、新しいデータフレームを作成します。
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)
}
}