Конвертируя коды icd9 в R, сохраняйте только лучший результат, когда есть кратные
Я пытаюсь преобразовать коды icd9 в коды icd10. Некоторые преобразования имеют несколько результатов. Я просто хочу сохранить лучший результат и поместить его в новый столбец.
У меня есть датафрейм с именем test
> test
icd9
1 4260
2 41401
3 42821
4 8602
5 1869
6 41071
И функция convICD из пакета icdcoder.
> test$icd10=convICD(test$icd9, "icd9")
Error in `$<-.data.frame`(`*tmp*`, icd10, value = list(icd9 = c("1869", :
replacement has 7 rows, data has 6
Выдает ошибку, так как некоторые преобразования имеют более одного результата. Например, код 1869 преобразует два разных значения.
> convICD(1869, "icd9")
icd9 icd10
1 1869 C6210
2 1869 C6290
Я просто хочу создать новый столбец в тесте, тест $icd10, который имеет первый результат из каждой версии. Так, например, когда он преобразует 1869, он просто преобразует его в C6210. Я уверен, что есть действительно простое решение для этого, но я не могу думать об этом.
1 ответ
library(icdcoder)
library(data.table)
test <- data.frame(icd9 = c(4260, 41401, 42821, 8602, 1869, 41071))
Хотя он использует data.table
внутренне, функция предназначена для возврата data.frame
:
str(convICD(test$icd9, "icd9"))
## 'data.frame': 7 obs. of 2 variables:
## $ icd9 : chr "1869" "1869" "41071" "41401" ...
## $ icd10: chr "C6210" "C6290" "I214" "I2510" ...
## 'data.frame': 7 obs. of 2 variables:
## $ icd9 : chr "1869" "1869" "41071" "41401" ...
## $ icd10: chr "C6210" "C6290" "I214" "I2510" ...
Это также ударяет оригинальный заказ:
convICD(test$icd9, "icd9")
## icd9 icd10
## 1 1869 C6210
## 2 1869 C6290
## 3 41071 I214
## 4 41401 I2510
## 5 4260 I442
## 6 42821 I5021
## 7 8602 S271XXA
Если вы можете жить с изменением заказа, то - так как вы застряли loading data.table
в любом случае - просто используйте его идиому для этого:
res <- data.table(convICD(test$icd9, "icd9"))
data.frame(res[, .SD[1], by="icd9"])
## icd9 icd10
## 1 1869 C6210
## 2 41071 I214
## 3 41401 I2510
## 4 4260 I442
## 5 42821 I5021
## 6 8602 S271XXA