我有很長的患者處方資料,并希望創建一個更廣泛的資料框,其中每行代表不同的處方交付。因此,有些患者只有一排,但多次分娩的患者會有多排(每次處方交貨 1 排)。我以前只以一種非常簡單的方式使用了樞軸命令,但我很掙扎,因為我只為每個患者取回 1 行,當我想要每個患者的每個處方交付日期都有 1 行時。
我有一個非常簡單的患者 ID、處方交付日期和與他們收到的處方相對應的代碼的資料框。
id = id = factor(c("1001","1001","1001","1002","1002","1002","1002","1002","1003","1003"))
date = c("2013-10-31","2013-11-30","2013-12-31","2013-08-28","2013-08-28","2013-09-30",
"2013-09-30","2013-02-15","2013-02-15","2013-02-15")
atc_code = c("C07AA05","C07AA05","C07AA05","A10BA02","C09CA01","A10BA02",
"C09CA01","A10BA02","A10BA02","C07AA05")
date1 <- as.Date(date, format = "%Y-%m-%d")
df <- data.frame(id,
date1,
atc_code)
df
#> id date1 atc_code
#> 1 1001 2013-10-31 C07AA05
#> 2 1001 2013-11-30 C07AA05
#> 3 1001 2013-12-31 C07AA05
#> 4 1002 2013-08-28 A10BA02
#> 5 1002 2013-08-28 C09CA01
#> 6 1002 2013-09-30 A10BA02
#> 7 1002 2013-09-30 C09CA01
#> 8 1002 2013-02-15 A10BA02
#> 9 1003 2013-02-15 A10BA02
#> 10 1003 2013-02-15 C07AA05
Created on 2021-12-04 by the reprex package (v2.0.1)
我希望資料框看起來像什么:
df
#> id date atc_code_1 atc_code_2
#> 1 1001 2013-10-31 C07AA05 NA
#> 2 1001 2013-11-30 C07AA05 NA
#> 3 1001 2013-12-31 C07AA05 NA
#> 4 1002 2013-08-28 A10BA02 C09CA01
#> 5 1002 2013-09-30 A10BA02 C09CA01
#> 6 1002 2013-02-15 A10BA02 NA
#> 7 1003 2013-02-15 A10BA02 C07AA05
實際上,一個病人一年可以有更多的分娩,單次分娩可以有更多的處方,但我在這個例子中保持簡單。任何幫助將不勝感激。
我需要做的是創建一個帶有 mutate(一種疾病)的新變數,該變數在單次交付中使用處方組合來定義(即,患者是否獲得了 x 和 y 處方,或者他們是否獲得了 x 而不是 y 處方),所以如果這可以通過一系列 group_bys 或其他東西來實作,這也可以。
謝謝!
uj5u.com熱心網友回復:
使用 data.table :(
記錄的順序與您想要的不同)
library(data.table)
setDT(df)
dcast(df, id date1 ~ rowid(id, date1, prefix = 'atc_code_'),
value.var = 'atc_code')
id date1 atc_code_1 atc_code_2
1: 1001 2013-10-31 C07AA05 <NA>
2: 1001 2013-11-30 C07AA05 <NA>
3: 1001 2013-12-31 C07AA05 <NA>
4: 1002 2013-02-15 A10BA02 <NA>
5: 1002 2013-08-28 A10BA02 C09CA01
6: 1002 2013-09-30 A10BA02 C09CA01
7: 1003 2013-02-15 A10BA02 C07AA05
uj5u.com熱心網友回復:
考慮ave添加一個運行組計數id和date1分組然后reshape寬。(下面num需要作為臨時變數,ave但可以使用任何數字欄位。)
df <- within(df, {
atc_num <- ave(1:nrow(df), id, date1, FUN=seq_along)
}) |> reshape(
idvar = c("id", "date1"),
timevar = "atc_num",
direction = "wide"
)
df
id date1 atc_code.1 atc_code.2
1 1001 2013-10-31 C07AA05 <NA>
2 1001 2013-11-30 C07AA05 <NA>
3 1001 2013-12-31 C07AA05 <NA>
4 1002 2013-08-28 A10BA02 C09CA01
6 1002 2013-09-30 A10BA02 C09CA01
8 1002 2013-02-15 A10BA02 <NA>
9 1003 2013-02-15 A10BA02 C07AA05
uj5u.com熱心網友回復:
您可以使用tidyverse. 對于每個組(即id和date1),我們mutate為每條記錄指定一個新列(我們將使用它來轉換到新列)。然后,您可以使用pivot_wider與category名稱和atc_codes把所需格式。
library(tidyverse)
df %>%
dplyr::group_by(id, date1) %>%
dplyr::mutate(category = paste0("atc_code_", 1:n())) %>%
tidyr::pivot_wider(names_from = category, values_from = atc_code) %>%
dplyr::arrange(id, date1)
輸出
# A tibble: 7 × 4
# Groups: id [3]
id date1 atc_code_1 atc_code_2
<fct> <date> <chr> <chr>
1 1001 2013-10-31 C07AA05 NA
2 1001 2013-11-30 C07AA05 NA
3 1001 2013-12-31 C07AA05 NA
4 1002 2013-02-15 A10BA02 NA
5 1002 2013-08-28 A10BA02 C09CA01
6 1002 2013-09-30 A10BA02 C09CA01
7 1003 2013-02-15 A10BA02 C07AA05
資料
df <- structure(
list(
id = structure(
c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
3L, 3L),
.Label = c("1001", "1002", "1003"),
class = "factor"
),
date1 = structure(
c(
16009, 16039, 16070, 15945, 15945, 15978, 15978,
15751, 15751, 15751
),
class = "Date"
),
atc_code = c(
"C07AA05", "C07AA05", "C07AA05", "A10BA02", "C09CA01",
"A10BA02", "C09CA01", "A10BA02", "A10BA02", "C07AA05"
)
),
class = "data.frame",
row.names = c(NA, -10L)
)
uj5u.com熱心網友回復:
我想這就是你想要的:
library(tidyverse)
df <- df %>% group_by(id, date1) %>% mutate(num_scripts = row_number())
df_wide <- df %>% pivot_wider(names_from = num_scripts, values_from = atc_code)
編輯:更改列名稱以匹配您的名稱
df_wide <- df %>% pivot_wider(names_from = num_scripts, values_from = atc_code, names_prefix = "atc_code_")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/372995.html
上一篇:嵌套ifelse運算式的混淆
