24

レプリケーションのために、各データ フレームのメタ データを含むコードブックを保持するのが好きです。データ コードブックは次のとおりです。

データベースに含まれる変数の明確かつ包括的な説明を提供する、書面またはコンピューター化されたリスト。 Marczyk ら( 2010 )

変数の次の属性を文書化するのが好きです。

  • 名前
  • 説明 (ラベル、フォーマット、スケールなど)
  • ソース (例: 世界銀行)
  • ソース メディア (URL とアクセス日、CD と ISBN など)
  • ディスク上のソース データのファイル名 (コードブックをマージするときに役立ちます)
  • ノート

たとえば、これは、データ フレームmydata1の変数を 8 つの変数で文書化するために実装しているものです。

code.book.mydata1 <- data.frame(variable.name=c(names(mydata1)),
     label=c("Label 1",
              "State name",
              "Personal identifier",
              "Income per capita, thousand of US$, constant year 2000 prices",
              "Unique id",
              "Calendar year",
              "blah",
              "bah"),
      source=rep("unknown",length(mydata1)),
      source_media=rep("unknown",length(mydata1)),
      filename = rep("unknown",length(mydata1)),
      notes = rep("unknown",length(mydata1))
)

読み取ったデータセットごとに異なるコードブックを作成します。データ フレームをマージするとき、関連するコードブックの関連する側面もマージして、最終的なデータベースを文書化します。これを行うには、基本的に上記のコードをコピーして貼り付け、引数を変更します。

4

5 に答える 5

7

関数を使用して、任意の R オブジェクトに特別な属性を追加できますattr。例えば:

x <- cars
attr(x,"source") <- "Ezekiel, M. (1930) _Methods of Correlation Analysis_.  Wiley."

オブジェクトの構造で指定された属性を確認します。

> str(x)
'data.frame':   50 obs. of  2 variables:
 $ speed: num  4 4 7 7 8 9 10 10 10 11 ...
 $ dist : num  2 10 4 22 16 10 18 26 34 17 ...
 - attr(*, "source")= chr "Ezekiel, M. (1930) _Methods of Correlation Analysis_.  Wiley."

attrまた、同じ関数で指定された属性をロードすることもできます:

> attr(x, "source")
[1] "Ezekiel, M. (1930) _Methods of Correlation Analysis_.  Wiley."

データ フレームに新しいケースを追加するだけの場合、指定された属性は影響を受けません (参照:str(rbind(x,x))構造を変更すると、指定された属性が消去されます (参照: str(cbind(x,x)))。


更新:コメントに基づく

すべての非標準属性を一覧表示する場合は、次の点を確認してください。

setdiff(names(attributes(x)),c("names","row.names","class"))

これにより、すべての非標準属性が一覧表示されます (標準は、データ フレーム内の名前、row.names、クラス)。

それに基づいて、すべての非標準属性と値をリストする短い関数を作成できます。以下は機能しますが、きちんとした方法ではありません...改善して関数を作成できます:)

最初に、uniqe (=非標準) 属性を定義します。

uniqueattrs <- setdiff(names(attributes(x)),c("names","row.names","class"))

名前と値を保持する行列を作成します。

attribs <- matrix(0,0,2)

非標準属性をループし、名前と値をマトリックスに保存します。

for (i in 1:length(uniqueattrs)) {
    attribs <- rbind(attribs, c(uniqueattrs[i], attr(x,uniqueattrs[i])))
}

行列をデータ フレームに変換し、列に名前を付けます。

attribs <- as.data.frame(attribs)
names(attribs) <- c('name', 'value')

任意の形式で保存します。例:

write.csv(attribs, 'foo.csv')

変数ラベルに関する質問については、必要なことを正確に行うため、read.spssパッケージ Foreign の関数を確認してください: attrs セクションに値ラベルを保存します。主な考え方は、attr はデータ フレームまたはその他のオブジェクトである可能性があるため、すべての変数に対して一意の「attr」を作成する必要はなく、1 つだけ作成し (たとえば、「変数ラベル」に名前を付ける)、そこにすべての情報を保存するということです。 . 次のように呼び出すことができます。attr(x, "variable.labels")['foo']ここで、「foo」は必要な変数名を表します。ただし、詳細については、上記の関数とインポートされたデータ フレームの属性を確認してください。

これらが、必要な関数を上で試したよりもずっときれいな方法で書くのに役立つことを願っています! :)

于 2011-03-17T00:11:02.570 に答える
5

ここcomment()で関数が役立つかもしれません。オブジェクトのコメント属性を設定および照会できますが、他の通常の属性が出力されないという利点があります。

dat <- data.frame(A = 1:5, B = 1:5, C = 1:5)
comment(dat$A) <- "Label 1"
comment(dat$B) <- "Label 2"
comment(dat$C) <- "Label 3"
comment(dat) <- "data source is, sampled on 1-Jan-2011"

これは次を与えます:

> dat
  A B C
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
> dat$A
[1] 1 2 3 4 5
> comment(dat$A)
[1] "Label 1"
> comment(dat)
[1] "data source is, sampled on 1-Jan-2011"

マージの例:

> dat2 <- data.frame(D = 1:5)
> comment(dat2$D) <- "Label 4"
> dat3 <- cbind(dat, dat2)
> comment(dat3$D)
[1] "Label 4"

しかし、それはコメントを失いますdat():

> comment(dat3)
NULL

したがって、これらの種類の操作は明示的に処理する必要があります。本当にやりたいことを行うには、おそらく、抽出/マージ操作中にコメント/メタデータを維持する、使用する関数の特別なバージョンを作成する必要があります。または、独自のクラスのオブジェクトを作成することを検討することもできます。たとえば、メタデータを保持するデータ フレームとその他のコンポーネントを含むリストとして作成します。次に、メタデータを保持する関数のメソッドを記述します。

これらの線に沿った例は、順序や時間/日付情報などを保持する追加のコンポーネントを含む時系列のリストオブジェクトを生成するzooパッケージですが、作成者が提供しているため、サブセット化などの観点からは通常のオブジェクトのように機能します[などの関数のメソッド

于 2011-03-17T15:25:13.527 に答える
5

より高度なバージョンは、S4 クラスを使用することです。たとえば、バイオコンダクターでは、ExpressionSetを使用して、マイクロアレイ データとそれに関連付けられた実験メタ データを保存します。

セクション 4.4で説明されている MIAME オブジェクトは、次のようになります。

experimentData <- new("MIAME", name = "Pierre Fermat",
          lab = "Francis Galton Lab", contact = "pfermat@lab.not.exist",
          title = "Smoking-Cancer Experiment", abstract = "An example ExpressionSet",
          url = "www.lab.not.exist", other = list(notes = "Created from text files"))
于 2011-03-17T13:19:03.403 に答える
4

これを行う方法は少し異なり、技術的ではありません。私は一般的に、テキストがコンピューターにとって意味のあるものではなく、人間にとってのみ意味を持つように設計されている場合、それはソース コードのコメントに属するという基本原則に従います。

これはかなり「ローテク」に感じるかもしれませんが、これを行うにはいくつかの正当な理由があります。

  • 将来誰かがあなたのコードを手にしたとき、コメントが明確に彼らに読まれることを意図していることは直感的です。データ構造内の通常とは異なる場所に設定されたパラメーターは、将来のユーザーにはわからない可能性があります。
  • 抽象オブジェクト内に設定されたパラメーターを追跡するには、かなりの規律が必要です。コード コメントの作成にも規律が必要ですが、コメントがないことはすぐにわかります。説明がオブジェクトの一部として実行されている場合、コードを一瞥しただけではこれは明らかではありません。その場合、コードは「リテラシーなプログラミング」という言葉の意味で「リテラシー」が低くなります。
  • データ オブジェクト内にデータの記述を保持すると、誤った記述になる可能性があります。これは、たとえば、単位をポンドに変換するために、kg 単位の測定値を含む列に 2.2 を掛けた場合に発生する可能性があります。メタデータを更新する必要性を見落とすのは非常に簡単です。

明らかに、オブジェクトと共にメタデータを運ぶことには、いくつかの実際の利点があります。また、ワークフローによって上記の点があまり重要でない場合は、データ構造にメタデータを添付することが非常に理にかなっている可能性があります。私の意図は、「低技術」のコメントベースのアプローチが考慮される可能性があるいくつかの理由を共有することだけでした.

于 2011-03-17T15:28:44.343 に答える