我有這樣的資料:
df<-structure(list(record_id = c(1, 2, 4), alcohol = c(1, 2, 1),
ethnicity = c(1, 1, 1), bilateral_vs_unilateral = c(1, 2,
2), fat_grafting = c(1, 1, 0), number_of_adm_sheets_used = c(1,
NA, NA), number_of_adm_sheets_used_2 = c(1, 1, 1), number_of_fills = c(7,
NA, NA), number_of_fills_2 = c(7, NA, 2), total_fill_volume_ml_left = c(240,
NA, NA), total_volume_ml = c(240, 300, 550), implant_size_l = c(NA_real_,
NA_real_, NA_real_), implant_size_l_2 = c(NA_real_, NA_real_,
NA_real_)), row.names = c(NA, -3L), class = c("tbl_df", "tbl",
"data.frame"))
這是關于患者的資訊,每行代表接受過乳房手術的患者。
我想將其更改為代表特定乳房(兩個)的每一行。有幾個變數,從“number_of_adm_sheets_used”到“implant_size_l_2”,每邊都有一個列。我想改變那些來代表。例如,左側代表“number_of_adm_sheets_used”,右側代表“number_of_adm_sheets_used_2”。我想將它們組合成一列用于任一側的床單。
我的預期輸出如下所示:
預

郵政-

我認為它是 pivot_longer 的一些變體,但我在幾個方面遇到了問題:
- 真實資料有 68 列
- 如果列“bilateral_vs_unilateral”是“1”(意思是雙邊),我只需要一個重復的行
- 我以前使用 pivot_longer 的方式,你會說“cols”并選擇一個很大的范圍,我不確定如何堆疊成對的列,如果這有意義的話。
- 幸運的是,盡管有 68 個其他列,但所有“麻煩”列都顯示在下面。將 'number_of_adm_sheets_used' 與 'number_of_adm_sheets_used_2' 'number_of_fills' 與 'number_of_fills_2' 'total_fill_volume_ml_left' 與 'total_volume_ml' 和 'implant_size_1' 與 'implant_size_1_2' 配對
謝謝
uj5u.com熱心網友回復:
如果我正確理解了這個問題,這是一種可能性。
# Make long format
df.long <- df %>%
pivot_longer(cols = -record_id) %>%
mutate(subject = ifelse(str_sub(name, -2, -1) == "_2", "breast 2", NA),
name = str_remove(name, "_2")) %>%
group_by(record_id, name) %>%
mutate(subject = case_when(
subject == "breast 2" ~ subject,
n() == 2 ~ "breast 1",
n() == 1 ~ "patient"
)) %>%
ungroup()
# statistics regarding the patient
patient <- df.long %>%
filter(subject == "patient") %>%
pivot_wider(names_from = name, values_from = value) %>%
select(-subject)
# statistics regarding each breast
breasts <- df.long %>%
filter(str_detect(subject, "breast")) %>%
pivot_wider(names_from = name, values_from = value)
# merge the two data.frames
patient %>%
inner_join(breasts) %>%
select(record_id, subject, everything())
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426670.html
標籤:r
