根据第二个数据框的日期将值分配给分组的数据框

爱德华·塔比

我有一个水质样品结果的数据集,我想根据质控样品的结果指定等级(Prelim_dql)。

我有两个不同的数据框。一种用于水质样品,一种用于QC结果。

将水质样品分为几批。此简化的示例版本有两组(grp1和grp2)。

Group   ID  Result  DateTime    Prelim_dql
grp1    1   218.7   7/14/2009   
grp1    2   1119.9  7/20/2009   
grp1    3   128.1   7/27/2009   
grp1    4   192.4   8/5/2009    
grp1    5   524.7   8/18/2009   
grp1    6   325.5   9/2/2009    
grp2    7   19.2    7/13/2009   
grp2    8   15.26   7/16/2009   
grp2    9   14.58   8/13/2009   
grp2    10  13.06   8/13/2009   
grp2    11  12.56   10/12/2009  

质量控制样本的简化版本如下所示:

Group QCID  DateTime    DQL
grp1    1   7/26/2009   A
grp1    2   7/29/2009   C
grp2    3   7/14/2009   A
grp2    4   9/10/2009   B
grp2    5   10/12/2009  A

我希望能够根据质量控制样品的日期范围来分配样品结果等级。如果采样日期在第一个质量控制结果之前,那么我想从第一个质量控制结果中分配DQL。如果采样日期在两个质量控制结果之间,我想指定两个DQL中的较低者(A是最高等级,C是最低等级)。如果结果在最后一个质量控制结果之后,请从最后一个质量控制结果中分配DQL。

在这种情况下,我想得到以下结果:

Group ID    Result  DateTime    Prelim_dql
grp1    1   218.7   7/14/2009   A
grp1    2   1119.9  7/20/2009   A
grp1    3   128.1   7/27/2009   C
grp1    4   192.4   8/5/2009    C
grp1    5   524.7   8/18/2009   C
grp1    6   325.5   9/2/2009    C
grp2    7   19.2    7/13/2009   A
grp2    8   15.26   7/16/2009   B
grp2    9   14.58   8/13/2009   B
grp2    10  13.06   8/13/2009   B
grp2    11  12.56   10/12/2009  A

我已经搜索了,但是我不知道该怎么做。有任何想法吗?

MKR

使用sqldfdplyr可以实现一种解决方案请注意,列的名称Group已更改为Grpas Group,不是中的有效名称sqldf

方法:修改QC数据框,以便每一行定义适用的日期范围,并添加一列以指示该行包含max组的日期。加入这个修改QCsamples得到期望的结果。

#Data to be used are

samples <- read.table(text = "Grp   ID  Result  DateTime
grp1    1   218.7   7/14/2009   
grp1    2   1119.9  7/20/2009   
grp1    3   128.1   7/27/2009   
grp1    4   192.4   8/5/2009    
grp1    5   524.7   8/18/2009   
grp1    6   325.5   9/2/2009    
grp2    7   19.2    7/13/2009   
grp2    8   15.26   7/16/2009   
grp2    9   14.58   8/13/2009   
grp2    10  13.06   8/13/2009   
grp2    11  12.56   10/12/2009", header = T, stringsAsFactors = F)

samples$DateTime = as.POSIXct(samples$DateTime, format = "%m/%d/%Y")

QC <- read.table(text = "Grp QCID  DateTime    DQL
grp1    1   7/26/2009   A
grp1    2   7/29/2009   C
grp2    3   7/14/2009   A
grp2    4   9/10/2009   B
grp2    5   10/12/2009  A", header = T, stringsAsFactors = F)

QC$DateTime = as.POSIXct(QC$DateTime, format = "%m/%d/%Y")

library(dplyr)
library(sqldf)

# Add a column for end of applicable day of a DQL using lag
# Add another column to indicate a row contains Max date for that group
QC_Mod <- QC %>% group_by(Grp) %>%
  mutate(ApplicableAfter = lag(DateTime)) %>%
  mutate(IsMaxDate = ifelse(DateTime == max(DateTime),1,0)) %>% 
  as.data.frame()

# Join the data.frames to find DQL value
sqldf("SELECT samples.Grp, samples.ID,  samples.Result,  samples.DateTime , QC_Mod.DQL as Prelim_dql 
      FROM samples, QC_Mod
      WHERE samples.Grp == QC_Mod.Grp AND 
      (
      (samples.DateTime <= QC_Mod.DateTime AND QC_Mod.ApplicableAfter IS NULL) OR
      (QC_Mod.ApplicableAfter IS NOT NULL AND samples.DateTime > QC_Mod.ApplicableAfter AND samples.DateTime <= QC_Mod.DateTime) OR
      (samples.DateTime > QC_Mod.DateTime AND QC_Mod.IsMaxDate == 1)
      )")

#  Result
#  Grp ID  Result   DateTime       Prelim_dql
#  1  grp1  1  218.70 2009-07-14          A
#  2  grp1  2 1119.90 2009-07-20          A
#  3  grp1  3  128.10 2009-07-27          C
#  4  grp1  4  192.40 2009-08-05          C
#  5  grp1  5  524.70 2009-08-18          C
#  6  grp1  6  325.50 2009-09-02          C
#  7  grp2  7   19.20 2009-07-13          A
#  8  grp2  8   15.26 2009-07-16          B
#  9  grp2  9   14.58 2009-08-13          B
#  10 grp2 10   13.06 2009-08-13          B
#  11 grp2 11   12.56 2009-10-12          A

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将新列分配给R中第二个数据框的数据框列表

根据第二个数据框设置数据框的值

根据第二个数据框的日期范围计算平均浓度

根据来自不同数据框的第二(较短)列的值将值分配给列

根据第二个数据框R上的索引替换数据框中的值

根据第二个数据框列中的匹配替换“数据框列”中的值

根据第二个数据框的匹配列更新熊猫数据框

根据第二个数据框中的匹配键将列表追加到Spark数据框列

数据框中的值介于第二个数据框中的值之间

使用第二个数据框中的值过滤数据框

将数据框中的列与R中第二个数据框中的重复值合并

pandas:如果该值在第二个数据框中,则根据另一个数据框中的条件替换列中的值

根据第二列中的值在第二个数据框中的任何行的容差范围内,过滤数据框列

基于第二个数据框优化 Pandas 分配

根据熊猫中第二个数据框的列值从一个数据框删除列

根据第二个数据框中的行在一个数据框中设置Pandas中的值

根据第二个数据框中的部分匹配创建新列

将一个数据框映射到第二个数据框

将1个数据框中的多个列中的值匹配到第二个数据框中的键并创建列

根据过滤器,使用第二个数据框中的值更新数据框

新的多维数组将值从数组分配给第二个数组的索引

根据第二个的NA值覆盖熊猫数据框中的值

熊猫:从第二个数据框更新列值

从第二个数据框中查找值

使用数据框中的值作为键来替换第二个数据框中的值

根据主题编号将值从一个数据框分配给另一个数据框

使用数据框中的行值选择第二个数据框中的列

如何使用熊猫从第二个数据框中过滤数据框中2列的值

熊猫,如何避免使用iterrow(如何根据另一个数据框的值将值分配给数据框的新列)