2

data.frames を生成する際の珍しい状況 (特に再現性のない SO の質問の場合) は、ある列が別の列の (通常はランダムな) 値に依存する場合です。たとえば、回帰をテストするために data.frame が必要な場合は、ノイズの多い線形依存関係があると便利です。

n <- 100
x <- runif(n)
dat <- data.frame( x=x, y=x+runif(n) )
plot(y~x,data=dat)

y 対 x

ただし、理想的にはグローバル環境に何もデポジットせずに、1行で実行したいと思います(上記は2行としてカウントされ、最初はxを作成し、2番目はdata.frame割り当てでxを使用します)。

4

6 に答える 6

5

を使用した簡単なソリューションを次に示しwithinます。

within(data.frame(x = runif(n)), y <- x + runif(n))

このコマンドは、グローバル環境 (または親フレーム) には割り当てません。y

于 2012-12-02T13:15:17.583 に答える
3

set.seed乱数を再現可能にするために必要になりますが、これを試みるモジュロ以外の場合は次のようになります。

set.seed(123)
dat <- transform(data.frame(x = runif(10)), y = x + runif(10))

これは与える:

> dat
           x         y
1  0.2875775 1.2444109
2  0.7883051 1.2416393
3  0.4089769 1.0865476
4  0.8830174 1.4556508
5  0.9404673 1.0433920
6  0.0455565 0.9453815
7  0.5281055 0.7741932
8  0.8924190 0.9344786
9  0.5514350 0.8793557
10 0.4566147 1.4111184
于 2012-12-02T15:59:03.523 に答える
3

多くのプログラマーが固執するのを好む「1行に1つの割り当て」ルールを破らない1つの方法を次に示します。

within(data.frame(row.names = 1:n), {x = runif(n); y = x + runif(n)})

wheredata.frame(row.names = 1:n)を使用して、適切な行数の空の data.frame を作成します。そうしないと、問題が発生しwithinます。

于 2012-12-02T13:00:16.607 に答える
3

これは、あなたが特定した2つの欠点のどちらにも悩まされないソリューションです。

library(data.table)
n <- 100

dat <- data.table(x = runif(n))[, y := x + runif(n)]

それ自体の欠点は次のとおりです。

  1. パッケージ全体をロードする必要があります。
  2. 少し醜くなります(つまり、「プレーンオールド」を返しdata.frame(data.table(......))たい場合。data.frame
于 2012-12-02T13:04:18.260 に答える
2

transformこれは(または)のように機能するカスタム関数plyr::mutateですが、初期データフレームは必要ありません。(明らかに、誰もこの機能を持たないので、これはOPの質問にはあまり役立ちませんが、とにかく他の人が興味を持っているかもしれないと思いました)

create <- function(...) {
  .data <- list()

  cols <- as.list(substitute(list(...))[-1])
  cols <- cols[names(cols) != ""] # Silently drop unnamed columns

  for(col in names(cols)) {
    .data[[col]] <- eval(cols[[col]], .data, parent.frame())
  }
  as.data.frame(.data)
}
create(x = runif(1:10), y = x + 1)
于 2012-12-02T15:07:58.020 に答える
1

これが私が思いついた最高のものです。よりコンパクトなコードを書くためのトリックとして、R の初心者によくある間違いを使用しています。

dat <- data.frame( x<-runif(n), y=x+runif(n) )

これは、CodeGolf.SE に関する @Tommy のヒントと精神的に似ています。

欠点は次のとおりです。

  1. 混乱する可能性があります。これは非常によくある間違いであり、専門のコード レビュー担当者がこの場合の間違いで混乱する可能性があるため、特にそうです。
  2. x他の変数を上書きする可能性がある親 (グローバル、ほとんどのユースケース) 環境での預金。

編集

コメントの@WojciechSobalaのソリューションは、ここで強調する価値があります。local上記の式を次のようにラップするだけです。

dat <- local( data.frame( x<-runif(n), y=x+runif(n) ) )

デフォルトでは、グローバル環境ではなく、この新しい環境で作成されることを除いて、local同じように動作するためevalq(たとえば、特定の環境で式を評価します) 。new.env()x

于 2012-12-02T12:40:34.263 に答える