数据帧的逻辑合并

use*_*827 0 r

我有两个data.frames,其中一个包含一式三份完成的多个实验的特定顺序(DF1设计表); 另一个包含这些实验的结果(一式三份,DF2结果表).第一个数据帧具有随机的实验顺序,结果表具有不同的顺序.

DF1的前六列包含实验的因素,例如温度,试剂的当量等......结果表DF2也具有相同的六列以及包含实验结果的其他列,例如产量,各种试剂的转换等......

表格的不同之处在于行数.结果表比设计表少三行.

我如何计算这两个表,以便将结果附加到设计中,以便设计表中的实验参数与实验表中的相应结果相匹配.

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
Run Code Online (Sandbox Code Playgroud)

但一式三份.

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
Run Code Online (Sandbox Code Playgroud)

再次一式三份,注意到少了一行.请注意,结果列比显示的列多.

关于所有这些工作的重点:我正在研究是否可以将包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)
)
Run Code Online (Sandbox Code Playgroud)

我在这段代码中遇到了NA的问题.但在我到达NA之前,我发现我有一个参数'FUN'缺少错误.

我想我要么偏离标准,要么非常接近答案,但两者中的哪一个.有人能指出我正确的方向吗?

编辑...我拥有的七行数据的样本,我将标题更改为A,B,C和D,这两个数据都是data.frames共有的.

      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
Run Code Online (Sandbox Code Playgroud)

其他data.frame包含标题A,B,C和D以及具有良率,转换和其他结果的列.我需要第一个data.frame完全如所示,yield等标记在最后.

Aru*_*run 5

data.table包(其允许对于x [Y]的语法),该作业非常容易.假设df1并且df2是您的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
Run Code Online (Sandbox Code Playgroud)

给你想要的结果.

编辑:我已经使用了您编辑的数据,它似乎工作.

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
Run Code Online (Sandbox Code Playgroud)