【问题标题】:In R, create/fill a column of a data frame based on an approximate numerical match to values in a second data frame在 R 中,根据与第二个数据帧中的值的近似数值匹配创建/填充数据帧的一列
【发布时间】:2016-04-20 21:29:41
【问题描述】:

我有两个数据框。第一个数据框包含我在实验中看到的药物列表。第二个数据框包含我在实验中运行的标准列表 - 所以它是另一个药物列表,其中包含预期的时间来查看它们。

我要做的是在第一个数据框中将正确标准的名称分配给正确的药物。

例如,药物 A 在 5.5 分钟时出现。药物 A 的标准是在 5.7 分钟。

在 6 分钟时观察到药物 B。它使用与药物 A 相同的标准,只需 5.7 分钟。

在 6.5 分钟时观察到药物 C。它使用 7 分钟可见的标准。

原始数据框示例:

DF1:
Drug   Time
 A     5.5
 B     6.0
 C     6.5

DF2:
Standard   Time
 S1        5.7
 S2        7

关键是我希望 R 以 最接近 时间(正向或负向)与 DF2 中的一个标准查找标准,然后指定该标准的名称 ( S1, S2) 到 DF1。

最终数据框示例:

Drug   Time   Standard
 A      5.5     S1
 B      6.0     S1
 C      6.5     S2

我知道如何获得完全匹配的值来分配 - 但我不确定如何让 R 在 DF2 中搜索最接近 DF1 中每一行的时间值的值。

【问题讨论】:

    标签: r matching


    【解决方案1】:

    使用 lapply 和 rbind,这是一种不太干净的方法。我相信我们会看到一些 dplyr 魔法:)

    DF1 = read.table(text="Drug   Time
    A     5.5
    B     6.0
    C     6.5",header=TRUE,stringsAsFactors=FALSE)
    
    
    DF2 = read.table(text="Standard   Time
    S1        5.7
    S2        7",header=TRUE,stringsAsFactors=FALSE)
    

    对于每个“时间”观察,我们找到最小绝对“标准”观察并创建包含(时间,标准)集的数据框。

    最后,我们通过 rbind 组合所有的数据框集。

    DF2$Standard[which.min(abs(DF2$Time - x) )] 这会找到符合上述条件的“标准”

    DF3 = do.call(rbind,lapply(DF1$Time,function(x) {
          data.frame(Time=x,Standard=DF2$Standard[which.min(abs(DF2$Time - x) )],stringsAsFactors=FALSE)
          }))
    
    final_DF = merge(DF1,DF3,by="Time")[,union(names(DF1), names(DF3))
    final_DF
    #  Drug Time Standard
    #1    A  5.5       S1
    #2    B  6.0       S1
    #3    C  6.5       S2
    

    【讨论】:

    • 询问,您将收到:DF1 %>% rowwise() %>% mutate(diff = DF2$Standard[which.min(abs(Time-DF2$Time))])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2021-01-11
    • 2012-08-13
    • 1970-01-01
    • 2020-10-09
    • 2018-04-28
    相关资源
    最近更新 更多