【发布时间】:2015-03-12 22:37:49
【问题描述】:
我搜索了很多地方(stackoverflow、r-blogger 等),但还没有找到在 R 中执行此操作的好选择。希望有人有一些想法。
我有一组环境采样数据。数据包括多种字段(访问日期、地区、地点、样本介质、样本成分、结果等)。
这是相关字段的子集。这是我开始的地方...
visit_date region location media component result
1990-08-20 LAKE 555723 water Mg *Nondetect
1999-07-01 HILL 432422 water Ca 3.2
2010-09-12 LAKE 555723 water pH 6.8
2010-09-12 LAKE 555723 water Mg 2.1
2010-09-12 HILL 432423 water pH 7.2
2010-09-12 HILL 432423 water N 0.8
2010-09-12 HILL 432423 water NH4 112
我希望达到的是这样的表格/数据框:
visit_date region location media component result pH
1990-08-20 LAKE 555723 water Mg *Nondetect *Not recorded
1999-07-01 HILL 432422 water Ca 3.2 *Not recorded
2010-09-12 LAKE 555723 water pH 6.8 6.8
2010-09-12 LAKE 555723 water Mg 2.1 6.8
2010-09-12 HILL 432423 water pH 7.2 7.2
2010-09-12 HILL 432423 water N 0.8 7.2
2010-09-12 HILL 432423 water NH4 112 7.2
我尝试使用这里的方法——
R finding rows of a data frame where certain columns match those of another -- 但不幸的是没有得到我想要的结果。相反,pH 列是我的预填充值 -999 或 NA,而不是该特定访问日期的 pH 值(如果已收集)。由于结果数据集大约有 500k 条记录,因此我使用unique(tResult$pH) 来确定 pH 列的值。
这就是尝试。 res 是原始结果 data.frame,component 是 pH 结果子集(主结果表中的 pH 样本结果)。
keys <- c("region", "location", "visit_date", "media")
tResults <- data.table(res, key=keys)
tComponent <- data.table(component, key=keys)
tResults[tComponent, pH>0]
我尝试在原始数据框上使用match、merge 和within,但没有成功。从那时起,我为组件生成了一个子集(在此示例中为 pH),我将结果列复制到一个新的“pH”列,认为我可以匹配键并在主要结果中更新一个新的“pH”列设置。
由于并非所有结果值都是数字(使用像 *Not recorded 这样的值),我尝试使用像 -888 这样的数字或其他可以替代的值,因此我可以强制至少结果和 pH 列是数字。除了 POSIXct 值的日期之外,其余列是 character 列。原始数据框是使用 StringsAsFactors=FALSE 创建的。
一旦我能做到这一点,我就可以为其他组件生成类似的列,这些列可用于填充和计算给定样本的其他值。至少这是我的目标。
所以我被这个难住了。在我看来这应该很容易,但我肯定没有看到它!
我们当然欢迎并感谢您的帮助和想法!
【问题讨论】:
-
为什么 Mg 的值为 6.8?你能详细说明一下吗?
-
这些都是为了说明而虚构的值,所以6.8在现实中没有依据。对于 Mg,300 mg/l 的值更现实。
标签: r dataframe data.table posixct