Общий вопрос о поиске комбинационных матчей - PullRequest
0 голосов
/ 21 апреля 2020

Я очень новичок в кодировании на R (пожалуйста, прости меня за любые ошибки в терминологии, этикет и т. Д. c.). Я решил начать проект, чтобы получить немного больше опыта. Я археолог, который изучает кости животных, и в моей области у нас есть количественная единица, называемая минимальным количеством элементов (MNE). Этот блок очень сложно вычислить вручную, и я пытаюсь автоматизировать расчет. MNE - это минимальное количество целых костей, которые могут представлять собой совокупность фрагментированных костей. Итак, у меня есть коды скелетных частей, которые представляют определенные части кости, и я разработал правила поиска комбинаций в определенной последовательности c. Определенные комбинации равны 1 MNE и т. Д. c.

. Вот пример моего кадра данных:

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. Чтобы быть более точным c, каков наилучший способ:

  1. Назначить определенные значения комбинациям PT (однако, PT 1 равен целой кости и равен 1 MNE. Итак, я Я должен дать это значение, даже если это не комбо.)

  2. Найти и извлечь эти комбинации (или отдельные значения) из вектора символов

  3. Подсчет их появления

  4. Загрузка этого подсчета в новый столбец "MNE"

  5. И все это в указанном order

Я, конечно, понимаю, что это сумасшедший вопрос c спросите у этого сообщества. Я полностью не ожидаю, что кто-нибудь решит все эти проблемы за меня. Но если у кого-нибудь есть какие-либо советы по определению c используемых функций и т. Д. c. Для любых шагов в этом процессе, я был бы чрезвычайно признателен. Я думал об использовании 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

И это будет go включаться до тех пор, пока не останется больше кодов деталей. При добавлении в столбец MNE, как указано, c найдены комбинации (или отдельные значения PT). Я надеюсь, что в этом есть смысл. Извиняюсь, если что-то здесь неясно.

1 Ответ

0 голосов
/ 22 апреля 2020

Предполагая, что 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, я думаю, вы можете заключить это в функцию и l oop (или применить) к комбинациям кода детали Вы хотите обработать.

Делает ли это то, что вы хотите?

...