我正在使用flextable()创建一个表。我想合并具有重复的srdr_id的单元格。
给出以下数据:
test <- structure(list(srdr_id = c("175124", "175124", "172545", "172545",
"172609", "172609", "172609"), full_name = c("TAU", "MI", "TAU",
"MI", "TAU", "MI", "MI"), article_arm_name = c("Control", "WISEteens",
"Assessed control", "Intervention", "Control", "Computer BI",
"Therapist BI"), arm_number = c(1L, 2L, 1L, 2L, 1L, 2L, 3L)), row.names = c(NA,
-7L), class = c("tbl_df", "tbl", "data.frame"))
srdr_id full_name article_arm_name arm_number
<chr> <chr> <chr> <int>
1 175124 TAU Control 1
2 175124 MI WISEteens 2
3 172545 TAU Assessed control 1
4 172545 MI Intervention 2
5 172609 TAU Control 1
6 172609 MI Computer BI 2
7 172609 MI Therapist BI 3
我可以使用以下代码进行操作-但想简化多个merge_at()语句。
flextable(test) %>% theme_box() %>%
merge_at(i = 1:2, j = 1) %>%
merge_at(i = 3:4, j = 1) %>%
merge_at(i = 5:7, j = 1)
不幸的是,当我添加另一个在通用srdr_id上重复的列时,简单的解决方案merge_v(j =〜srdr_id)不再足够。
test_2 <- structure(list(srdr_id = c("175124", "175124", "172525", "172525",
"172545", "172545", "172609", "172609", "172609"), substances = c("alcohol",
"alcohol", "alcohol", "alcohol", "cannabis", "cannabis", "alcohol\n cannabis\n other drugs",
"alcohol\n cannabis\n other drugs", "alcohol\n cannabis\n other drugs"
), full_name = c("TAU", "MI", "TAU", "MI (parent)", "TAU", "MI",
"TAU", "MI", "MI"), article_arm_name = c("Control", "WISEteens",
"Treatment as usual", "Brief MI (b-MI)", "Assessed control",
"Intervention", "Control", "Computer BI", "Therapist BI")), row.names = c(NA,
-9L), class = c("tbl_df", "tbl", "data.frame"))
# A tibble: 9 x 4
srdr_id substances full_name article_arm_name
<chr> <chr> <chr> <chr>
1 175124 alcohol TAU Control
2 175124 alcohol MI WISEteens
3 172525 alcohol TAU Treatment as usual
4 172525 alcohol MI (parent) Brief MI (b-MI)
5 172545 cannabis TAU Assessed control
6 172545 cannabis MI Intervention
7 172609 "alcohol\n cannabis\n other drugs" TAU Control
8 172609 "alcohol\n cannabis\n other drugs" MI Computer BI
9 172609 "alcohol\n cannabis\n other drugs" MI Therapist BI
答案 0 :(得分:1)
哇-我错过了简单案例的明显解决方案。已使用更现实(嵌套)的数据集对问题进行了编辑。
test_ft <- flextable(test) %>% theme_box() %>% merge_v(j = ~srdr_id)
答案 1 :(得分:1)
您可以为此创建一个自定义函数,因为flextable没有此选项。
test_2 <- structure(list(srdr_id = c("175124", "175124", "172525", "172525",
"172545", "172545", "172609", "172609", "172609"), substances = c("alcohol",
"alcohol", "alcohol", "alcohol", "cannabis", "cannabis", "alcohol\n cannabis\n other drugs",
"alcohol\n cannabis\n other drugs", "alcohol\n cannabis\n other drugs"
), full_name = c("TAU", "MI", "TAU", "MI (parent)", "TAU", "MI",
"TAU", "MI", "MI"), article_arm_name = c("Control", "WISEteens",
"Treatment as usual", "Brief MI (b-MI)", "Assessed control",
"Intervention", "Control", "Computer BI", "Therapist BI")), row.names = c(NA,
-9L), class = c("tbl_df", "tbl", "data.frame"))
merge_custom <- function(ft, x, columns){
z <- rle(x)
rows_at <- cumsum(z$lengths) - z$lengths + 1
for(i in seq_along(rows_at)){
for(j in columns)
ft <- merge_at(x = ft, i = seq( rows_at[i], rows_at[i] + z$lengths[i] - 1), j = j)
}
ft
}
flextable(test_2) %>% merge_custom(x = test_2$srdr_id, columns=1:2) %>% theme_box()