有关查找组合匹配项的一般问题

问题描述 投票:0回答:1

我对使用R编码非常陌生(请原谅我在术语,礼节等方面的任何错误)。我决定开始一个项目,以便获得更多的经验。我是一位研究动物骨骼的考古学家,在我的领域中,我们有一个定量单位,称为最小元素数(MNE)。这个单元很难手动计算,我正在尝试自动进行计算。 MNE是可以代表碎骨集合的最小全骨数。因此,我有代表骨骼某些部分的骨骼零件代码,并且我已经开发出规则,可以找到特定顺序的组合。某些组合等于1 MNE,等等。

这是我有一个数据框的示例:

EL_S    PT
1P_L    1
HU_L    107,107,107,108,108
FE_L    103,105,108,110,103,103,108,110,105,107,103

EL_S列代表骨骼元素和侧面(因此FE_L等于左股骨),而PT列是与该骨骼和侧面关联的零件代码的特征向量。例如,103和105的组合等于1 MNE。更具体地说,什么是最好的方法:

  1. 将某些值分配给PT组合(但是PT 1等于整个骨骼,是1 MNE。因此,即使它不是一个组合,我也必须给它一个值。)

  2. 从字符向量中查找并提取这些组合(或单个值)

  3. Tally它们的出现

  4. 将结果加载到新的“ MNE”列中

  5. 并以指定顺序完成所有操作

我当然意识到这是来自该社区的疯狂特定要求。我完全不希望有人会为我解决所有这些问题。但是,如果有人对要使用的特定功能有任何建议,等等,对于此过程中的任何步骤,我将不胜感激。我当时在考虑使用stringr将代码字符串组合成103105,然后计算这些匹配项。但是我不确定这是最有效的方法。再次感谢您提供任何帮助!

澄清编辑:

在理想世界中,这就是我希望创造的。

我从上面的示例开始:

EL_S    PT
1P_L    1
HU_L    107,107,107,108,108
FE_L    103,105,108,110,103,103,108,110,105,107,103

我想先找到并提取PT 1。该零件代码等于1 MNE。

EL_S    PT                                          MNE
1P_L                                                1
HU_L    107,107,107,108,108
FE_L    103,105,108,110,103,103,108,110,105,107,103

接下来,我想找到并提取组合103,105。等于1 MNE。在上表中,FE_L具有103,105个组合的两个实例,因此MNE = 2。

EL_S    PT                            MNE
1P_L                                  1
HU_L    107,107,107,108,108
FE_L    108,110,103,103,108,110,107   2

这将一直进行下去,直到没有更多的零件代码。找到特定组合后添加到“ MNE”列(或单个PT值)。我希望这是有道理的。抱歉,如果不清楚。

r pattern-matching matching string-matching
1个回答
0
投票

假设df看起来像这样:

df <- read.table(text = "EL_S    PT
1P_L    1
HU_L    107,107,107,108,108
FE_L    103,105,108,110,103,103,108,110,105,107,103", header = TRUE)


  EL_S                                          PT
1 1P_L                                           1
2 HU_L                         107,107,107,108,108
3 FE_L 103,105,108,110,103,103,108,110,105,107,103

我们可以将其转换为宽格式,并添加您想加入的列,该列最初以零填充:

library(tidyverse)

df_wide <- df %>% 
  separate_rows("PT") %>% 
  count(EL_S, PT) %>% 
  spread(PT, n, fill = 0) %>% 
  mutate(MNE = 0)


# A tibble: 3 x 8
  EL_S    `1` `103` `105` `107` `108` `110`   MNE
  <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1P_L      1     0     0     0     0     0     0
2 FE_L      0     4     2     1     2     2     0
3 HU_L      0     0     0     3     2     0     0

我认为我们需要迭代进行(因为我们处理事情的顺序很重要)。您的示例的第一步是零件代码1。我们选择正确的计数列,应用最小值,将其添加到计数栏中,然后从我们已经考虑的观察值中减去此数。

part_codes <- c("1")
num_mne <- apply(df_wide[part_codes], 1, FUN=min)
df_wide$MNE <- df_wide$MNE + num_mne
df_wide[part_codes] <- df_wide[part_codes] - num_mne


# A tibble: 3 x 8
  EL_S    `1` `103` `105` `107` `108` `110`   MNE
  <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1P_L      0     0     0     0     0     0     1
2 FE_L      0     4     2     1     2     2     0
3 HU_L      0     0     0     3     2     0     0

然后,我们可以对103,105执行相同的操作:

part_codes <- c("103", "105")
num_mne <- apply(df_wide[part_codes], 1, FUN=min)
df_wide$MNE <- df_wide$MNE + num_mne
df_wide[part_codes] <- df_wide[part_codes] - num_mne


# A tibble: 3 x 8
  EL_S    `1` `103` `105` `107` `108` `110`   MNE
  <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1P_L      0     0     0     0     0     0     1
2 FE_L      0     2     0     1     2     2     2
3 HU_L      0     0     0     3     2     0     0

由于代码与part_codes变量相同,所以我认为您可以将其包装在函数中并循环(或应用)要处理的零件代码组合。

这是您想要的吗?

© www.soinside.com 2019 - 2024. All rights reserved.