В R можно ли вписать символьные строки из соответствующих кодов и наоборот? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть набор данных, в котором есть пары код-строка. Другими словами, есть столбец кодов и соответствующий столбец символьных строк, которые являются описаниями кодов.

Проблема состоит из трех частей ...

  • ПРОБЛЕМА 1: иногда отсутствуют коды, но присутствует строка символов.
  • ПРОБЛЕМА 2: иногда коды присутствуют, но строка символов отсутствует
  • ПРОБЛЕМА 3: Иногда строки символов для одного и того же кода являются разными строками, но означают одно и то же («синонимы»).

Придуманные примеры:

 +-------+------------------+
 |  CODE |  STRING          |
 +-------+------------------+
 |   A1  |  broken bones    |
 |   A1  |  broken bones    |
 |   NA  |  broken bones    |
 |   A1  |  bones, broken   |
 |   A1  |  bones, fracture |
 |   A1  |  NA              |
 |   B1  |  red blood cells |
 |   B1  |  red blood cells |
 |   B1  |  blood cells, red|
 |   B1  |  NA              |
 |   B1  |  erythrocytes    |
 |   NA  |  broken bones    |
 |   C1  |  liver disease   |
 |   C1  |  liver disease   |
 |   C1  |  hepatic illness |
 |   C1  |  NA              |
 |   C1  |  disease, liver  |
 |   NA  |  liver disease   |
 +-------+------------------+ 

Мои вопросы ...

  1. Если код присутствует, можно ли ввести строку символов? И наоборот.
  2. Могут ли они быть вменены, если строки пар код-строка различаются, но повторяются? (например, гепатит c болезнь)
  3. Если так, есть ли пакет R, который может сделать этот тип вменения?

1 Ответ

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

Вот один из способов сделать это:

get_commonest <- function(level, code, string)
{
  names(rev(sort(table(na.omit(string[code == level])))))[1]
}

codes <- na.omit(unique(df$CODE))
strings <- na.omit(unique(df$STRING))

default_strings <- as.data.frame(sapply(codes, get_commonest, df$CODE, df$STRING))
default_codes <- as.data.frame(sapply(strings, get_commonest, df$STRING, df$CODE))

df$CODE[is.na(df$CODE)] <- as.character(default_codes[df$STRING[is.na(df$CODE)],])
df$STRING[is.na(df$STRING)] <- as.character(default_strings[df$CODE[is.na(df$STRING)],])

Дать вам этот результат:

df
#>    CODE           STRING
#> 2    A1     broken bones
#> 3    A1     broken bones
#> 4    A1     broken bones
#> 5    A1    bones, broken
#> 6    A1  bones, fracture
#> 7    A1     broken bones
#> 8    B1  red blood cells
#> 9    B1  red blood cells
#> 10   B1 blood cells, red
#> 11   B1  red blood cells
#> 12   B1     erythrocytes
#> 13   A1     broken bones
#> 14   C1    liver disease
#> 15   C1    liver disease
#> 16   C1  hepatic illness
#> 17   C1    liver disease
#> 18   C1   disease, liver
#> 19   C1    liver disease

Данные, приведенные в вопросе, представлены в воспроизводимом формате здесь:

df <- structure(list(CODE = c("A1", "A1", NA, "A1", "A1", "A1", "B1", 
"B1", "B1", "B1", "B1", NA, "C1", "C1", "C1", "C1", "C1", NA), 
    STRING = c("broken bones", "broken bones", "broken bones", 
    "bones, broken", "bones, fracture", NA, "red blood cells", 
    "red blood cells", "blood cells, red", NA, "erythrocytes", 
    "broken bones", "liver disease", "liver disease", "hepatic illness", 
    NA, "disease, liver", "liver disease")), row.names = 2:19, class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...