У меня есть две таблицы, которые я хотел бы объединить для создания сводной таблицы.
df1 <- data.frame(median=c(151, 98, 125, 47),
Q25=c(148, 90, 120, 44),
Q75=c(158, 104, 132, 53),
pass_or_fail=c('pass')
)
row.names(df1)<-c("param1", "param2", "param3", "param4")
df2 <- data.frame(median=c(148, 95, 135, 40),
Q25=c(140, 88, 130, 35),
Q75=c(150, 100, 141, 45),
pass_or_fail=c('fail')
)
row.names(df2)<-c("param1", "param2", "param3", "param4")
rbind(df1, df2)
Результат, который я ищу, показан ниже, где имена строк являются общими для двух фреймов данных, столбцы сгруппированы по «пройдено» или «не пройдено», а значение отображается как медиана с IQR в скобках.
Результатом rbind являются измененные имена строк, поскольку повторяющиеся имена не допускаются. Мне интересно, как я могу решить проблему переименования имен строк и можно ли отобразить IQR в скобках с помощью kable или другой функции.
library(dplyr)
library(tibble)
library(tidyr)
bind_rows(rownames_to_column(df1),
rownames_to_column(df2)) %>%
mutate(stat = paste0(median, " (", Q25, "-", Q75, ")"), .keep = "unused") %>%
pivot_wider(names_from = pass_or_fail, values_from = stat) %>%
column_to_rownames()
#> pass fail
#> param1 151 (148-158) 148 (140-150)
#> param2 98 (90-104) 95 (88-100)
#> param3 125 (120-132) 135 (130-141)
#> param4 47 (44-53) 40 (35-45)
Created on 2024-07-07 with reprex v2.0.2
Немного cbind
забавы: использование пробела df1[0]
для сохранения имен строк:
cbind(
df1[0],
pass = with(df1,
paste0(median, " (", Q25, "-", Q75, ")")),
fail = with(df2[rownames(df1),],
paste0(median, " (", Q25, "-", Q75, ")"))
)
# pass fail
#param1 151 (148-158) 148 (140-150)
#param2 98 (90-104) 95 (88-100)
#param3 125 (120-132) 135 (130-141)
#param4 47 (44-53) 40 (35-45)
Использование sprintf
с do.call
.
> sapply(list(df1[-4], df2[-4]), \(x) do.call('sprintf', c('%s (%s-%s)', x))) |>
+ `dimnames<-`(list(rownames(df1[-4]), unique(c(df1[, 4], df2[, 4])))) |>
+ as.data.frame()
pass fail
param1 151 (148-158) 148 (140-150)
param2 98 (90-104) 95 (88-100)
param3 125 (120-132) 135 (130-141)
param4 47 (44-53) 40 (35-45)
Данные:
> dput(df1)
structure(list(median = c(151, 98, 125, 47), Q25 = c(148, 90,
120, 44), Q75 = c(158, 104, 132, 53), pass_or_fail = c("pass",
"pass", "pass", "pass")), class = "data.frame", row.names = c("param1",
"param2", "param3", "param4"))
> dput(df2)
structure(list(median = c(148, 95, 135, 40), Q25 = c(140, 88,
130, 35), Q75 = c(150, 100, 141, 45), pass_or_fail = c("fail",
"fail", "fail", "fail")), class = "data.frame", row.names = c("param1",
"param2", "param3", "param4"))