将一个 R 数据表中的列添加到另一个数据表中

3

又有一个R的问题。已经查看了data.table文档,并看到了以下类似的解决方案:

但不幸的是,虽然它们很接近,但我在理解上还是缺少了些什么。

我的初始数据表包括一个包含结果的表和另一个包含标准的表。这两个表之间有几列是相同的。以下是一个示例(每个表都有更多的列,但它们之间不共享)。

Results
ID    Region   Locale    Medium    Name          Method
3324   Agate    Zone C    water     Cadmium        Z
2432   Gneiss   Zone B    air       Calcium        R
2433   Agate    Zone A    water     Molybdenum     Q
78882  Agate    Zone D    water     Iron           M

Standards
ID   Region   Locale   Medium     Name    CoeffA    CoeffB
3214  Agate   Zone A    water     Cadmium  -.243    1.43
3324  Agate   Zone C    water     Cadmium  -.243    1.43
2432  Gneiss  Zone B    water     Calcium  .432     0.44
78882 Agate   Zone D    water     Iron     1.475    0

存在许多结果不符合标准,有些结果甚至没有标准。

我想做的是将标准表的数学系数值作为新列(C-aC-b)添加到结果表中。最终,我将使用这些值来计算比较标准值。

Results
ID    Region   Locale    Medium    Name          Method      C-a         C-b
3324   Agate    Zone C    water     Cadmium      Z           -.243      1.43
2432   Gneiss   Zone B    air       Calcium      R           .432       0.44
2433   Agate    Zone A    water     Molybdenum   Q           NA         NA
78882  Agate    Zone D    water     Iron         M           1.475       0

我已尝试以下方法但均未成功:
  1. Results[Standards] 将返回标准值,但结果列为 NA
  2. Standards[Results] 将返回结果值,但标准列为 NA
  3. 使用setkey(c("ID","Region","Locale","Medium"))ResultsStandards的公共关键列后,在使用merge(Results, Standards),将会返回标准值,但结果列为 NA
我原本认为上述语法之一一定会返回具有非NA系数列的结果。
请问您有什么建议或意见吗?
非常感谢您的热心帮助。

使用 dput 函数在您的数据表上提供示例数据。看起来您想使用 setkey 然后 Standards[Results] - jangorecki
1
这不是使用 setkey 的正确方式。 - Frank
2个回答

4

你可以尝试以下方法执行此操作,无需使用setkey

require(data.table)
newResults <- merge(x = Results, y = Standards, by = "ID", all.x = TRUE)
setnames(newResults,"CoeffA","C-a")
setnames(newResults,"CoeffB","C-b")

newResults
ID     Region   Locale    Medium    Name         Method      C-a        C-b
2432   Gneiss   Zone B    air       Calcium      R           .432       0.44
2433   Agate    Zone A    water     Molybdenum   Q           NA         NA
3324   Agate    Zone C    water     Cadmium      Z           -.243      1.43
78882  Agate    Zone D    water     Iron         M           1.475      0

如果您不想要NA值:

newResults[is.na(newResults)] <- 0   #replace NA with Zero
newResults[is.na(newResults)] <- "No value available" #replace NA with Text 

1

首先,setkey不能用于多个变量,您需要使用setkeyv。

setkeyv(Results,c("ID","Region","Locale","Medium"))
setkeyv(Standards,c("ID","Region","Locale","Medium"))

然后:

JoinedDT <- merge(Results,Standards, all.x = TRUE)

这将在任何没有标准行的结果行中给出一个“NA”。如果一个结果行有多个标准行,则在生成的数据表中将会得到两行。
要将“NA”设置为“0”:
JoinedDT[is.na(JoinedDT$CoeffA),CoeffA:= 0]
JoinedDT[is.na(JoinedDT$CoeffB),CoeffB:= 0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接