【发布时间】:2018-12-27 01:37:40
【问题描述】:
我正在尝试编写一个相当复杂的迭代匹配函数,但我淹没在 ifelse 和不起作用的函数中。不幸的是,我没有人可以提出想法,因此感谢任何支持或想法。
我的数据结构
我的数据的每一行都是一个包含许多变量的观察结果,相关变量包含在此示例中。观察有一个指定的Sample_Name、一个对应于样本名称的Matching_Group、Time 的测量值和一个主观的Assigned_idx,它从数据清理的早期部分中部分完成。每个观察到的 Sample_Name 可以包含 0-7 个观察值,但 Matching_Group 将始终包含 7 个观察值。
structure(list(Sample_Name = c("A", "A", "A", "A", "A", "B", "B", "B",
"B", "B", "B", "QQ", "QQ", "QQ", "QQ", "QQ", "QQ", "QQ", "SS",
"SS", "SS", "SS", "SS", "SS", "SS"), Matching_Group = c("QQ",
"QQ", "QQ", "QQ", "QQ", "SS", "SS", "SS", "SS", "SS", "SS", "QQ",
"QQ", "QQ", "QQ", "QQ", "QQ", "QQ", "SS", "SS", "SS", "SS", "SS",
"SS", "SS"), Time = c(1, 1.1, 1.2, 1.4, 1.6, 7.203, 7.395,
7.5, 7.6, 7.7, 7.802, 1, 1.102, 1.2, 1.3, 1.398, 1.501, 1.6,
7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8), Assigned_idx = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 2, 3, 4, 5, 6, 7, 1, 2,
3, 4, 5, 6, 7)), row.names = c(NA, -25L), class = c("tbl_df",
"tbl", "data.frame"))
Sample_Name Matching_Group Time Assigned_idx
A QQ 1.000
A QQ 1.100
A QQ 1.200
A QQ 1.400
A QQ 1.600
B SS 7.203
B SS 7.395
B SS 7.500
B SS 7.600
B SS 7.700
B SS 7.802
QQ QQ 1.000 1
QQ QQ 1.102 2
QQ QQ 1.200 3
QQ QQ 1.300 4
QQ QQ 1.398 5
QQ QQ 1.501 6
QQ QQ 1.600 7
SS SS 7.200 1
SS SS 7.300 2
SS SS 7.400 3
SS SS 7.500 4
SS SS 7.600 5
SS SS 7.700 6
SS SS 7.800 7
我的问题
对于每个观察(行),我想计算对应Matching_Group 的每个 行之间Time 的比率。每个Matching_Group 将分配一个唯一的Time_Ratio 值,计算需要等于+/- 一些容差。如果计算出的比率匹配特定于该组的预定义比率,我想提取并分配属于@987654333 观察的行中的Assigned_idx @ 并将其分配给观察。如果不是,请使用相同的观察到的Time 和Matching_Group 的下一行中的Time 重复计算。重复直到每个观察值在Assigned_idx 中都有一个值。
示例:在此数据集中,对于Matching_Group,Time_Ratio 应等于1.000 +/- 0.0020。在我的真实数据集中,每个Matching_Group 将有唯一的Time_Ratio 值,在单独的表中指定。所以对于 Time = 1.200 的第 3 行,Matching_Group 是 QQ。当我们使用第一个观察时间QQ 计算比率时,1.200/1.000 = 1.200 超出了我们定义的容差 --> 下一个观察时间 QQ。 1.200/1.102 = 1.089...再次超出我们的容忍范围。最后,1.200/1.200 = 1.000 确实在我们为此Matching_Group 指定的容差范围内。在具有匹配率的Matching_Group 的观察行中,Assigned_idx 列包含3。我们获取该值,并将其映射到第 3 行的 Assigned_idx 列。然后对第 4 行重复此操作并迭代该过程。
期望的结果:
Sample_Name Matching_Group Time Assigned_idx Time_Ratio (Sample:Matching)
A QQ 1.000 1 1.0000
A QQ 1.100 2 0.9982
A QQ 1.200 3 1.0000
A QQ 1.400 5 1.0014
A QQ 1.600 7 1.0000
B SS 7.203 1 1.0004
B SS 7.395 3 0.9993
B SS 7.500 4 1.0000
B SS 7.600 5 1.0000
B SS 7.700 6 1.0000
B SS 7.802 7 1.0003
QQ QQ 1.000 1 1.0000
QQ QQ 1.102 2 1.0000
QQ QQ 1.200 3 1.0000
QQ QQ 1.300 4 1.0000
QQ QQ 1.398 5 1.0000
QQ QQ 1.501 6 1.0000
QQ QQ 1.600 7 1.0000
SS SS 7.200 1 1.0000
SS SS 7.300 2 1.0000
SS SS 7.400 3 1.0000
SS SS 7.500 4 1.0000
SS SS 7.600 5 1.0000
SS SS 7.700 6 1.0000
SS SS 7.800 7 1.0000
我已经尝试使用 dplyr 来解决这个问题,因为我认为它应该能够处理我想要完成的事情(也许 purrr 更适合?)。不幸的是,我似乎无法在 ifelse 和 for 函数中适当地对条件和表达式进行排序。我的尝试包括将 %>% 变异与比率计算、data.table::shift 等混合在一起,但我似乎无法让它与我的条件参数一起使用。此外,如果它是相关的,在我的真实数据中将有约 50 个“名称”和约 25 个匹配组。我将有第二个数据源列出匹配的组名和各自的比例,但在此示例中未包含此类详细信息。
我真的很难过,任何想法都值得赞赏。
【问题讨论】:
-
从
dplyr包中签出case_when() -
在描述问题时,如果您可以从数据中添加示例或命名法,将会有所帮助。例如,比率是
Variable值之间的比率吗? “观察组的名称”是指Name,“另一列指定要匹配的不同组”是指Relative Group吗?您能否举一个比率匹配失败的示例,然后根据后续行发生“提取和分配”?一般来说,在此过程中提供基于示例的说明将使您更容易理解您的问题。 -
@GordonShumway 谢谢,我会在今天晚些时候阅读
case_when(),看看我能否取得进展。 -
@andrew_reece 感谢您提供有用的反馈,我已根据您的 cmets 更新了我的帖子,希望事情变得更加清晰。