R 数据帧的逻辑合并

R 数据帧的逻辑合并,r,R,我有两个数据框,其中一个包含了大量实验的特定顺序,一式三份(DF1设计表);另一份包含这些实验的结果(一式三份,DF2为结果表)。第一个数据帧具有随机的实验顺序,结果表具有不同的顺序 DF1的前六个色谱柱包含实验因素,如温度、试剂当量等。。。结果表DF2也有相同的六列以及包含实验结果的其他列,例如产率、各种试剂的转化率等 各表的行数不同。结果表比设计表少三行 如何将这两个表合并,以便将结果附加到设计中,从而使设计表中的实验参数与实验表中的相应结果相匹配 DF1 但一式三份 DF2 再次一式三份,

我有两个数据框,其中一个包含了大量实验的特定顺序,一式三份(DF1设计表);另一份包含这些实验的结果(一式三份,DF2为结果表)。第一个数据帧具有随机的实验顺序,结果表具有不同的顺序

DF1的前六个色谱柱包含实验因素,如温度、试剂当量等。。。结果表DF2也有相同的六列以及包含实验结果的其他列,例如产率、各种试剂的转化率等

各表的行数不同。结果表比设计表少三行

如何将这两个表合并,以便将结果附加到设计中,从而使设计表中的实验参数与实验表中的相应结果相匹配

DF1

但一式三份

DF2

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

关于所有这些工作的要点:我正在考虑是否可以将包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)
)

另一个data.frame包含标题A、B、C和D以及包含收益率、转换和其他结果的列。我需要第一个data.frame与末尾标记的yield etc完全相同。

data.table包(允许使用x[y]语法)使这项工作非常简单。假设
df1
df2
是您的数据帧:

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
require(data.table)

dt1data.table
package(允许x[y]语法)使这项工作非常简单。假设
df1
df2
是您的数据帧:

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
require(data.table)
dt1您的标题提到“合并”,但您似乎没有尝试过
merge
功能。(还是我遗漏了什么?)

以下是前两个示例
data.frame
s:

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))
下面是Arun创建的两个
data.frame
s上的
merge
的结果。请注意,我们不需要指定要合并的列,因为它们具有公共列名

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
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
#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
您的标题提到了“合并”,但您似乎没有尝试过
合并功能。(还是我遗漏了什么?)

以下是前两个示例
data.frame
s:

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))
下面是Arun创建的两个
data.frame
s上的
merge
的结果。请注意,我们不需要指定要合并的列,因为它们具有公共列名

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
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
#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

可能是我给出的示例数据,但当我将代码与现有数据一起使用时,会出现错误。“[.data.table”(dt2,dt1)中的错误:typeof x.Temp(double)!=typeof i.Block.ccd(integer)Hi@Arun,我建议的表有102行。上面的代码是将data.frame转换为data.table的唯一方法吗?Hi@Arun,我的实际数据返回,
[.data.table
(dt2,dt1)中的错误:x.“Temp”是一个连接到i的因子列。“Temp”类型为“integer”。因子列必须连接到因子列或字符列。它可能与我提供的示例数据有关,但当我将代码与我拥有的数据一起使用时,“[.data.table”(dt2,dt1):typeof x.Temp(double)!=typeof i.Block.ccd(integer)中出现错误Hi@Arun,我建议的表有102行。上面的代码是将data.frame转换为data.table的唯一方法吗?Hi@Arun,我的真实数据返回,
[.data.table
(dt2,dt1)中的错误:x.“Temp”是一个要连接到i的因子列。“Temp”类型为“整数”。因子列必须连接到因子列或字符列。将尝试此操作并返回报告,@anadaBoth answers处理给定的示例数据。感谢您的帮助。我勾选了两个答案,但默认设置只允许一个答案占优势。特别感谢@Arun用于吸引我对data.tables的注意。当应用于我的真实数据集时,我得到了“fix.by(by.x,x)中的错误):“by”必须匹配列数“这是我的尝试,尝试。1@user1945827,第6-9列和第2、3、6、4列的名称是什么?你可以尝试两件事之一:(1)使用列名,就像我在示例中所做的那样;(2)重命名每个数据集中的相关列,使它们相同(换句话说,DF1中的第6列应与DF2中的第2列同名)使用列名,就像我在我的示例作品中所做的那样,因为没有返回任何错误。谢谢。我将尝试此操作并向您报告,@anadaBoth answers对给定的示例数据进行了处理。Than
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
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