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

时间:2015-04-06 22:36:21

标签: r data.table

另一个R问题。仔细查看了data.table vignettes 并看到了类似这样的解决方案:

但不幸的是,当他们接近时,我在某种程度上忽略了我的理解。

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

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

我尝试了以下但没有成功:

  • Results[Standards]生成标准值,结果列为NA
  • Standards[Results]会将标准列的结果值生成为NA
  • merge(Results,Standards)用于setkey(c("ID","Region","Locale","Medium"))Results的公共密钥列后,
  • Standards生成标准值,结果列为NA

我原以为其中一种语法肯定会产生系数列,其值不是NA

有关我应该在哪里或我缺少什么的任何建议?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

试试这个,你可以不用 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

如果您不想要NAs:

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

答案 1 :(得分:0)

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

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

然后:

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

这将在没有标准行的任何结果行中提供NA。如果一个Results行有多个Standards行,您将在结果数据表中获得两行。

NA设为0

JoinedDT[is.na(JoinedDT$CoeffA),CoeffA:= 0]
JoinedDT[is.na(JoinedDT$CoeffB),CoeffB:= 0]