Я создал таблицу сопоставления в R и привел пример того, как она выглядит:
ex <- data.frame("id" = c(rep(1234,7)), "claim" = c(1234, 1367, 1234, 1869, 1234, 1367,1234),
"code1" = c(24, 61, 28, 21, 20, 29,80), date = c('2019-03-18', '2019-04-12',
'2019-03-18', '2019-03-18',
'2019-03-18', '2019-04-12', '2019-03-18'),
'code2' = c(24,29,24,24,24, 29,24), dx1=c("M234","M123",NA,"M434",NA,NA, NA),
dx2=c(NA,NA,NA,NA,"M789","Z123", "M999"),
dx3 = c(NA,NA,"M689",NA,NA,NA, NA),
pay = c(1000, 520, 1000, 780, 1000,520,1000))
Есть ли способ, которым я мог бы найти способ получить это как мой окончательный результат:
ex2 <- data.frame("id" = c(rep(1234,3)), date = c('2019-03-18', '2019-03-18','2019-04-12'),
'code2' = c(24,24,29),
dx1=c("M234","M434","M123"),
dx2=c("M789",NA,"Z123"),
dx3 = c("M689",NA,NA),
dx4 = c("M999", NA, NA),
pay = c(1000,780,520))
В основном я хотел бы, чтобы любые значения в dx2 или dx3 в примере 1 просто добавлялись в ту же строку, соответствующую этому значению code2. Однако, если в dx1 есть несколько значений для code2, я хотел бы сохранить их в виде отдельной строки.
Есть ли способ сделать что-то подобное в R? Заранее спасибо!
edit: в моей таблице сопоставления (ex) есть только столбцы dx1, dx2, dx3. Я хотел бы, чтобы любое кратное значение в dx2 или dx3 добавлялось в качестве новых столбцов (именно поэтому в ex2 теперь есть столбец dx4). Эти изменения сгруппированы по code2. Таким образом, если в dx2 или dx3 есть несколько значений для кода 24, это будет определять, сколько новых столбцов dx2 будет создано. Затем порядок можно определить по столбцу max(pay).
Я включил объяснение в свой вопрос. Дайте мне знать, если это поможет!
спасибо, это полезная информация. это необычная схема манипуляции. например, если для каждого уровня в code2
есть 2 значения для dx1
, dx2
и dx3
, вы говорите, что вам нужны две строки (по одной для каждого dx1
), но затем четыре столбца в дополнение к dx1
, теперь dx2-5
? как вы решаете, какие из значений dx2
и dx3
помещаются в новые столбцы? возможно, если бы вы могли объяснить свой вариант использования немного больше, было бы легче помочь вам найти более простое решение.
также должны ли значения dx2
и dx3
появляться только в первой строке сгруппированного code2
? или они повторяются для всех строк, представляющих уникальный dx1
?
как следует относиться к строке 6 из ex
, где нет значения dx1
, но есть значение dx2
? в ex2
вы помещаете это значение dx2
в ту же строку, что и dx1
. но подумайте, есть ли два значения dx1
внутри code2 == 29
. как бы вы назначили dx2
в строке без dx1
?
Раньше я исключал столбец оплаты, но теперь включил его. Если я включу столбец оплаты, то я бы хотел назначить любой dx1, dx2 или dx3 на одну строку, если они имеют максимальное значение оплаты. Тогда второй dx1 будет во второй строке, так как это не максимальная оплата.
Вы требуете этого?
library(tidyverse)
ex %>% pivot_longer(cols = c("dx1", "dx2", "dx3"), names_to = "code3", values_to = "val", values_drop_na = T) %>%
arrange(claim, code2, code3) %>% group_by(id, claim, date, code2, code3) %>%
mutate(dummy = n(),
dummy2 = row_number(),
code3 = ifelse(dummy >1 & dummy2 >1, "dx4", code3)) %>% arrange(code3) %>%
pivot_wider(id_cols = c('id', 'claim', 'date', 'code2', 'pay'), names_from = 'code3', values_from = 'val', values_fn = min) %>%
ungroup() %>% select(-claim)
# A tibble: 3 x 8
id date code2 pay dx1 dx2 dx3 dx4
<dbl> <chr> <dbl> <dbl> <chr> <chr> <chr> <chr>
1 1234 2019-03-18 24 1000 M234 M789 M689 M999
2 1234 2019-04-12 29 520 M123 Z123 NA NA
3 1234 2019-03-18 24 780 M434 NA NA NA
Пожалуйста, уточните, может ли быть более двух значений в любом из dx1-dx3?
Соответствовало ли это требованию?
в
dx4
нетex
, а вex2
есть. похоже, что значениеdx4
является кратным значением дляdx2
. можете ли вы подробнее описать, как обрабатывать несколько значений для каждого типаdx
?