【问题标题】:How to copy specific values from one data column to another while matching other columns in R?如何在匹配 R 中的其他列的同时将特定值从一个数据列复制到另一列?
【发布时间】: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 列是我的预填充值 -999NA,而不是该特定访问日期的 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]

我尝试在原始数据框上使用matchmergewithin,但没有成功。从那时起,我为组件生成了一个子集(在此示例中为 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


【解决方案1】:
#df1 is your first data set and is dataframe
df1$phtem<-with(df1,ifelse(component=="pH",result,NA))

library(data.table)
library(zoo) # locf function

setDT(df1)[,pH:=na.locf(phtem,na.rm = FALSE)]
    visit_date region location media component     result phtem  pH
1: 1990-08-20   LAKE   555723 water        Mg *Nondetect    NA  NA
2: 1999-07-01   HILL   432422 water        Ca        3.2    NA  NA
3: 2010-09-12   LAKE   555723 water        pH        6.8   6.8 6.8
4: 2010-09-12   LAKE   555723 water        Mg        2.1    NA 6.8
5: 2010-09-12   HILL   432423 water        pH        7.2   7.2 7.2
6: 2010-09-12   HILL   432423 water         N        0.8    NA 7.2
7: 2010-09-12   HILL   432423 water       NH4        112    NA 7.2

# 如果不需要,可以删除 phtem。

编辑:

library(data.table)
setDT(df1)[,pH:=result[component=="pH"],by="region,location,visit_date,media"]
df1

   visit_date region location media component     result  pH
1: 1990-08-20   LAKE   555723 water        Mg *Nondetect  NA
2: 1999-07-01   HILL   432422 water        Ca        3.2  NA
3: 2010-09-12   LAKE   555723 water        pH        6.8 6.8
4: 2010-09-12   LAKE   555723 water        Mg        2.1 6.8
5: 2010-09-12   HILL   432423 water        pH        7.2 7.2
6: 2010-09-12   HILL   432423 water         N        0.8 7.2
7: 2010-09-12   HILL   432423 water       NH4        112 7.2

【讨论】:

  • 谢谢你。我正在研究结果,看看它是否是我需要的。到目前为止,一切顺利。
  • 我之前没有将zoo 视为解决方案。我要确保的是,从主要结果中填充的给定 pH 值与访问日期、地区、位置和介质相匹配(本质上是来自同一水的 pH 样本结果样本)。我只是想知道zoo's na.locf 是如何工作的。从我目前的阅读来看,它寻找先前的非 NA 值。它是否也在查看其他列以进行匹配或特别是日期?
  • 在这种情况下,您不需要使用na.locf 和动物园packagedata.table 就足够了。请查看更新后的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-02-11
  • 2020-03-08
  • 1970-01-01
  • 2016-12-11
  • 2021-06-13
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
相关资源
最近更新 更多