我对使用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。更具体地说,什么是最好的方法:
将某些值分配给PT组合(但是PT 1等于整个骨骼,是1 MNE。因此,即使它不是一个组合,我也必须给它一个值。)
从字符向量中查找并提取这些组合(或单个值)
Tally它们的出现
将结果加载到新的“ MNE”列中
并以指定顺序完成所有操作
我当然意识到这是来自该社区的疯狂特定要求。我完全不希望有人会为我解决所有这些问题。但是,如果有人对要使用的特定功能有任何建议,等等,对于此过程中的任何步骤,我将不胜感激。我当时在考虑使用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值)。我希望这是有道理的。抱歉,如果不清楚。
假设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
变量相同,所以我认为您可以将其包装在函数中并循环(或应用)要处理的零件代码组合。
这是您想要的吗?