1. ホーム
  2. r

[解決済み] Rデータフレームに行を追加する方法

2022-07-27 22:33:46

質問

StackOverflowを見回しましたが、私の問題(Rデータフレームに行を追加すること)に特化した解決策が見つかりません。

私は以下のように、空の2列のデータフレームを初期化しています。

df = data.frame(x = numeric(), y = character())

そして、私の目標は、値のリストを繰り返し処理し、各繰り返しにおいて、リストの最後に値を追加することです。私は次のようなコードから始めました。

for (i in 1:10) {
    df$x = rbind(df$x, i)
    df$y = rbind(df$y, toString(i))
}

また,関数 c , append そして merge を使ってもうまくいきません。何か提案があれば教えてください。

コメントからの更新です。 私はRがどのように使用されることを意図しているかを知っていると仮定しませんが、私はすべての反復でインデックスを更新するために必要となる追加のコード行を無視したかったし、私はそれが最終的に何行になるかわからないので、データフレームのサイズを簡単に事前割り当てすることはできません。上記は単に再現可能なおもちゃの例であることを忘れないでください。いずれにせよ、ご提案ありがとうございました。

どのように解決するのですか?

アップデート

あなたが何をしようとしているのか分かりませんが、もう一つ提案をします。各カラムに必要な型のベクトルをあらかじめ割り当てておき、それらのベクトルに値を挿入し、最後に data.frame .

続けて、Julianの f3 (事前に割り当てられた data.frame ) として定義された、これまでで最も高速なオプションです。

# pre-allocate space
f3 <- function(n){
  df <- data.frame(x = numeric(n), y = character(n), stringsAsFactors = FALSE)
  for(i in 1:n){
    df$x[i] <- i
    df$y[i] <- toString(i)
  }
  df
}

似たような方法ですが、こちらは data.frame は最後のステップとして作成されます。

# Use preallocated vectors
f4 <- function(n) {
  x <- numeric(n)
  y <- character(n)
  for (i in 1:n) {
    x[i] <- i
    y[i] <- i
  }
  data.frame(x, y, stringsAsFactors=FALSE)
}

microbenchmark は、quot;microbenchmark" パッケージから取得したものです。 system.time :

library(microbenchmark)
microbenchmark(f1(1000), f3(1000), f4(1000), times = 5)
# Unit: milliseconds
#      expr         min          lq      median         uq         max neval
#  f1(1000) 1024.539618 1029.693877 1045.972666 1055.25931 1112.769176     5
#  f3(1000)  149.417636  150.529011  150.827393  151.02230  160.637845     5
#  f4(1000)    7.872647    7.892395    7.901151    7.95077    8.049581     5

f1() (以下のアプローチ) は、信じられないほど非効率です。 data.frame を頻繁に呼び出すため、また、この方法でオブジェクトを成長させるとRでは一般に遅くなるからです。 f3() はプレアロケーションによりかなり改善されていますが data.frame の構造自体がボトルネックの一部になっている可能性があります。 f4() は、あなたが取りたいアプローチを損なうことなく、そのボトルネックを回避しようとします。


オリジナルの回答

本当はよくないのですが、この方法でやりたかったのであれば、やってみてもいいかと思います。

for (i in 1:10) {
  df <- rbind(df, data.frame(x = i, y = toString(i)))
}

あなたのコードでは、もう一つ問題があることに注意してください。

  • を使用する必要があります。 stringsAsFactors は、文字が因数に変換されないようにしたい場合に使用します。使用してください。 df = data.frame(x = numeric(), y = character(), stringsAsFactors = FALSE)