0

私は 2 つの data.frames を持っています。そのうちの 1 つには、3 通で行われた多くの実験の特定の順序が含まれています (DF1 設計テーブル)。もう 1 つは、これらの実験の結果を含みます (3 通の DF2 結果テーブル)。最初のデータフレームには実験のランダム化された順序があり、結果テーブルには異なる順序があります。

DF1 の最初の 6 列には、温度、試薬当量などの実験の要因が含まれています。結果テーブル DF2 にも、同じ 6 列と、実験の結果 (収率など) を含む列があります。 、各種試薬の変換 etc ...

テーブルは行数によって異なります。結果テーブルの行数は、設計テーブルよりも 3 行少なくなります。

計画表の実験パラメーターが実験表の適切な結果と一致するように、これらの 2 つの表を結合して計画に結果を添付するにはどうすればよいですか。

DF1

T1  A1  B1
T2  A1  B1
T1  A2  B1
T2  A2  B1
T1  A1  B2
T2  A1  B2
T1  A2  B2
T2  A2  B2

しかし三重に。

DF2

T1  A2  B2  1
T1  A2  B1  3
T2  A2  B1  3
T1  A1  B1  1
T2  A1  B2  2
T2  A2  B2  2
T2  A1  B1  2

再び 3 通で、行が 1 つ少ないことに注意してください。表示されている列よりも多くの結果列があることに注意してください。

このすべての作業の要点について: パッケージ RcmdrPlugin.DoE を実際のデータに適用できるかどうかを調べています。

私が試したことについては...まあ、ロジック関数でsapply、cbind、ifelseを使用することを考えました

sapply(
DF3 <- ifelse( DF1[,1] == DF2[,1] | DF1[,2] == DF2[,2] | DF2[,3] == DF2[,3],
cbind(DF1, DF2[,3]), NA)
)

このコードの NA に問題があります。しかし、NA にたどり着く前に、引数 'FUN' is missing エラーがあることがわかりました。

私は的外れであるか、答えに非常に近いと思いますが、どちらかです。誰かが私を正しい方向に向けることができますか?

編集...両方のdata.framesに共通する見出しをA、B、C、およびDに変更した7行のデータのサンプル。

      run.no run.no.std.rp Block.ccd   A     B C     D
C0.17      1         C0.17         0 400 147.5 5 2.675
C0.7       2          C0.7         0 450 120.0 2 4.000
C0.6       3          C0.6         0 350 175.0 2 4.000
C0.3       4          C0.3         0 450 120.0 8 4.000
C0.4       5          C0.4         0 350 120.0 8 4.000
C0.16      6         C0.16         0 350 120.0 2 1.350
C0.15      7         C0.15         0 450 120.0 2 1.350

もう一方の data.frame には、見出し A、B、C、および D と、収量、変換、およびその他の結果を含む列があります。最初の data.frame は、最後にタグ付けされた yield などで示されているとおりにする必要があります。

4

2 に答える 2

5

data.tableパッケージ (x[y] 構文を許可する) により、この作業が非常に簡単になります。と仮定するdf1df2、あなたのdata.frames:

require(data.table)
dt1 <- data.table(df1, key=c("V1","V2","V3"))
dt2 <- data.table(df2, key=c("V1","V2","V3"))
dt2[dt1]

#    V1 V2 V3 V4
# 1: T1 A1 B1  1
# 2: T1 A1 B2 NA
# 3: T1 A2 B1  3
# 4: T1 A2 B2  1
# 5: T2 A1 B1  2
# 6: T2 A1 B2  2
# 7: T2 A2 B1  3
# 8: T2 A2 B2  2

望ましい結果が得られます。

編集:編集したデータを使用しましたが、うまくいくようです。

df1 <- structure(list(V1 = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), 
                     .Label = c("T1", "T2"), class = "factor"), 
                 V2 = structure(c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), 
                 .Label = c("A1", "A2"), class = "factor"), 
                 V3 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
                 .Label = c("B1", "B2"), class = "factor")), 
                 .Names = c("V1", "V2", "V3"), 
                 class = "data.frame", row.names = c(NA, -8L))

df2 <- structure(list(V1 = structure(c(1L, 1L, 2L, 1L, 2L, 2L, 2L), 
                      .Label = c("T1", "T2"), class = "factor"), 
                      V2 = structure(c(2L, 2L, 2L, 1L, 1L, 2L, 1L), 
                      .Label = c("A1", "A2"), class = "factor"), 
                      V3 = structure(c(2L, 1L, 1L, 1L, 2L, 2L, 1L), 
                      .Label = c("B1", "B2"), class = "factor"), 
                      run.no = 1:7, 
                      run.no.std.rp = structure(c(3L, 7L, 6L, 4L, 5L, 2L, 1L), 
                      .Label = c("C0.15", "C0.16", "C0.17", "C0.3", "C0.4", "C0.6", "C0.7"), 
                      class = "factor"), 
                      Block.ccd = c(0L, 0L, 0L, 0L, 0L, 0L, 0L), 
                      A = c(400L, 450L, 350L, 450L, 350L, 350L, 450L), 
                      B = c(147.5, 120, 175, 120, 120, 120, 120), 
                      C = c(5L, 2L, 2L, 8L, 8L, 2L, 2L), 
                      D = c(2.675, 4, 4, 4, 4, 1.35, 1.35)), 
                      .Names = c("V1", "V2", "V3", "run.no", "run.no.std.rp", 
                      "Block.ccd", "A", "B", "C", "D"), 
                      row.names = c("C0.17", "C0.7", "C0.6", "C0.3", "C0.4", 
                      "C0.16", "C0.15"), class = "data.frame")

require(data.table)
dt1 <- data.table(df1, key=c("V1", "V2", "V3"))
dt2 <- data.table(df2, key=c("V1", "V2", "V3"))
dt2[dt1]
#    V1 V2 V3 run.no run.no.std.rp Block.ccd   A     B  C     D
# 1: T1 A1 B1      4          C0.3         0 450 120.0  8 4.000
# 2: T1 A1 B2     NA            NA        NA  NA    NA NA    NA
# 3: T1 A2 B1      2          C0.7         0 450 120.0  2 4.000
# 4: T1 A2 B2      1         C0.17         0 400 147.5  5 2.675
# 5: T2 A1 B1      7         C0.15         0 450 120.0  2 1.350
# 6: T2 A1 B2      5          C0.4         0 350 120.0  8 4.000
# 7: T2 A2 B1      3          C0.6         0 350 175.0  2 4.000
# 8: T2 A2 B2      6         C0.16         0 350 120.0  2 1.350
于 2013-01-28T12:17:36.013 に答える
1

タイトルに「マージ」と記載されていますが、merge機能を試していないようです。(または、何かが足りないのですか?)

最初の 2 つの例を次に示しますdata.frame

DF1 <- structure(list(T1 = c("T2", "T1", "T2", "T1", "T2", "T1", "T2"
  ), A1 = c("A1", "A2", "A2", "A1", "A1", "A2", "A2"), B1 = c("B1", 
  "B1", "B1", "B2", "B2", "B2", "B2")), .Names = c("T1", "A1", 
  "B1"), class = "data.frame", row.names = c(NA, -7L))

DF2 <- structure(list(T1 = c("T1", "T2", "T1", "T2", "T2", "T2"), A2 = c("A2", 
  "A2", "A1", "A1", "A2", "A1"), B2 = c("B1", "B1", "B1", "B2", 
  "B2", "B1"), X1 = c(3L, 3L, 1L, 2L, 2L, 2L)), .Names = c("T1", 
  "A2", "B2", "X1"), class = "data.frame", row.names = c(NA, -6L))

mergeベース R から使用する方法は次のとおりです。 by.xand引数には、両方の sby.yで共通に持つ必要がある列の名前を含める必要があります。data.frame引数は、all「空白」を削除せず、NA代わりに埋めることを示しています。

merge(DF1, DF2, 
      by.x = c("T1", "A1", "B1"), 
      by.y = c("T1", "A2", "B2"), 
      all = TRUE)
#   T1 A1 B1 X1
# 1 T1 A1 B1  1
# 2 T1 A1 B2 NA
# 3 T1 A2 B1  3
# 4 T1 A2 B2 NA
# 5 T2 A1 B1  2
# 6 T2 A1 B2  2
# 7 T2 A2 B1  3
# 8 T2 A2 B2  2

これは、Arun が作成mergeした 2 つのの結果です。data.frame共通の列名があるため、マージする列を指定する必要がないことに注意してください。

merge(df1, df2, all = TRUE)
#   V1 V2 V3 run.no run.no.std.rp Block.ccd   A     B  C     D
# 1 T1 A1 B1      4          C0.3         0 450 120.0  8 4.000
# 2 T1 A1 B2     NA          <NA>        NA  NA    NA NA    NA
# 3 T1 A2 B1      2          C0.7         0 450 120.0  2 4.000
# 4 T1 A2 B2      1         C0.17         0 400 147.5  5 2.675
# 5 T2 A1 B1      7         C0.15         0 450 120.0  2 1.350
# 6 T2 A1 B2      5          C0.4         0 350 120.0  8 4.000
# 7 T2 A2 B1      3          C0.6         0 350 175.0  2 4.000
# 8 T2 A2 B2      6         C0.16         0 350 120.0  2 1.350
于 2013-01-28T17:12:15.250 に答える