У меня есть list
из matrices
, показывающий результаты описательного анализа, полученные в результате предыдущего group_split()
, с коэффициентом.
То, что я хотел бы сделать, - это наложение соответствующих matrices
с использованием rbind()
с помощью функционального решения, которое позволяет итеративно выбирать соответствующие matrices
, связывать и форматировать их (т.е. задавать имена строк , имена и индивидуальный порядок строк). Последний шаг - напечатать matrices
, содержащий описательные результаты, используя kableExtra
.
Моя проблема: Использование rbind()
в a для l oop для связывания и итерации по соответствующим триплетам матрицы для rbind
их производит только желаемый результат для последнего триплета, но не для всех триплетов. Может быть, кто-то из вас имеет представление о том, где я иду не так. Я рассмотрел подобные вопросы здесь, но не нашел решения моей проблемы.
Вот пример использования tidyverse
и kableExtra
окружения пакета
# Some random data for an initial df
city <- rep(c(1:3), each = 4) %>% factor () # this is the splitting variable
gender <- rep(c("m", "f", "m", "f", "m", "f", "m", "f", "m", "f", "m", "f")) %>% factor () # this is a factor for a later subgrouping analysis
age <- c(32, 54, 67, 35, 19, 84, 34, 46, 67, 41, 20, 75)
working_yrs <- c(16, 27, 39, 16, 2, 50, 16, 23, 48, 21, 0, 57)
income <- (working_yrs)*50
df <- data.frame(city, gender, age, working_yrs, income)
cities <- city %>% levels () %>% c () # vector needed later for a for loop
# Group splits by city (dfs -> list of lists)
df1 <- select(df, -gender) %>%
group_split (city, keep=FALSE)
df2 <- select (df, -income) %>%
filter(str_detect(gender, "m")) %>%
select (city, age, working_yrs) %>%
group_split (city, keep = FALSE)
df3 <- select (df, -income) %>%
filter(str_detect(gender, "f")) %>%
select (city, age, working_yrs) %>%
group_split (city, keep = FALSE)
LOL <- c(df1, df2, df3) # list of lists
# Define function for descriptive analysis (list of lists -> list of matrices)
fun_descr <- function(x) {
c(n=sum(!is.na(x)),
Percent=((sum(!is.na(x)))/(sum(!is.na(x)) + sum(is.na(x)))*100),
Mean=mean(x, na.rm = TRUE),
SD=sd(x, na.rm = TRUE),
Median=median(x, na.rm = TRUE),
Quantile=quantile(x, 0.25, na.rm = TRUE),
Quantile=quantile(x, 0.75, na.rm = TRUE))
}
LOM <- lapply (LOL, function (x) {
t(apply(x, 2, fun_descr)) %>% round(digits = 1)
})
Пока все хорошо Теперь вот проблема. Мой подход к rbind()
соответствующим матричным триплетам, принадлежащим одному и тому же городу, дает правильные результаты только для последнего города.
for (i in 1:length(cities)) {
bindcity <- rbind(LOM[[i]], LOM[[i+length(cities)]], LOM[[i+(length(cities)*2)]])
}
bindcity
Если решение for
l oop или lapply
работает правильно, возвращая список rbound matrices
, я ожидал бы отформатировать строки и столбцы результирующего list
из matrices
следующим образом. К сожалению, поскольку предыдущий шаг не работает должным образом, я пока не смог его протестировать. Я все еще пытаюсь найти первую строку для этой функции, сортирующую строки каждой матрицы в следующем порядке строк 1,4,6,2,5,7,3, чтобы данные соответствовали именам строк, показанным ниже.
nicematrices <- lapply (bindcity, function (x) {
rownames(x) <- paste(list("Age", "Working years", "Age (male)", "Working years (male)", "Age (female)", "Working years (female)", "Income"))
colnames(x) <- paste(list("n (valid)", "% (valid)", "Mean", "SD", "Median", "25% Quantile", "75% Quantile"))
return(x)
})
Последний шаг: печать matrices
с использованием kableExtra
for (i in 1:length(nicematrices)) {
print(
kable(nicematrices[[i]], caption = "Title") %>%
column_spec(1, bold = T) %>%
kable_styling("striped", bootstrap_options = "hover", full_width = TRUE)
)}