另一个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-a
和C-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
。
有关我应该在哪里或我缺少什么的任何建议?
提前感谢您的帮助。
答案 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]