Я пытаюсь суммировать данные, используя две переменные - я в основном хочу разбить переменную 1 на переменную 2, чтобы отобразить результаты на гистограмме с накоплением 100%.
У меня есть несколько столбцов типа char и несколько столбцов типа numeric, которые можно разделить на две основные категории, которые будут использоваться для создания разбивки.
Я пытался использовать gather
из dplyr
для преобразования кадра данных в longform, однако результат не тот, который я ожидаю.
variable1_by_variable2 <- function (dataset, variable_1) {
#select variables columns - variable 1 columns are char, variable 2
#columns are numeric
variable_1_columns <- dataset[, data.table::`%like%`(names(dataset), variable_1)]
variable_2_columns <- dataset[, c('e_j', 'e_t', 'e_f', 'e_s', 'e_d', 'e_a')]
#create new dataframe including only relevant columns
df <- cbind(variable_1_columns, emotions_columns)
df[c('e_j', 'e_t', 'e_f', 'e_s', 'e_d', 'e_a')] <-
lapply(df[c('e_j', 'e_t', 'e_f', 'e_s', 'e_d', 'e_a')],
as.numeric)
#transform df to long form
new_df <- tidyr::gather(df, variable_2_columns, count, names(variable_2_columns[1]):names(variable_2_columns)[length(names(variable_2_columns))], factor_key=FALSE)
t_names <- names(variable_1_columns)
#count topics
t_count <- function (x) {
t <- sum(x == TRUE)
}
#group by variable 2 and count
new_df <- new_df %>%
dplyr::group_by(variable_2_columns) %>%
dplyr::summarise_at(t_names, .funs = t_count)
#transform new_df to longform
final_df <- tidyr::gather(new_df, t, volume, names(variable_1_columns[1]):names(variable_1_columns)[length(names(variable_1_columns))], factor_key=FALSE)
final_df <- data.frame(final_df)
return (final_df)
}
Это набор данных, который я использую:
structure(list(var_a = c("TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "FALSE", "FALSE", "FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE"), var_b = c("FALSE",
"FALSE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE"), var_c = c("FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE"
), var_d = c("FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE"), var_e = c("FALSE", "FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE"), var_f = c("FALSE",
"FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE",
"TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE", "TRUE"), e_j = c(0.5,
NaN, 0, 0.333333333333333, 0.333333333333333, 0.5, 0, 0, 1, 1,
0.666666666666667, NaN, 0, NaN, 0.5, 0.333333333333333, 0.333333333333333,
0, 0, 0, 0, 0.5, 0.333333333333333, 0, 0, 1, 0, 0.333333333333333,
0, NaN, 0.25, 0.5, 0.5, 0, 0, 0.5, 0.333333333333333, 0.5, 0.5
), e_t = c(0.5, NaN, 0, 0.666666666666667, 0.666666666666667,
0.5, 1, 0.333333333333333, 0, 0, 0.333333333333333, NaN, 1, NaN,
0.5, 0.666666666666667, 0.333333333333333, 0.25, 1, 1, 0.333333333333333,
0.5, 0.666666666666667, 1, 1, 0, 1, 0.666666666666667, 0, NaN,
0.25, 0.5, 0.5, 0.4, 0, 0.5, 0.5, 0.5, 0.5), fear = c(0, NaN,
0.5, 0, 0, 0, 0, 0.333333333333333, 0, 0, 0, NaN, 0, NaN, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NaN, 0, 0, 0, 0.2,
0, 0, 0, 0, 0), e_s = c(0, NaN, 0, 0, 0, 0, 0, 0, 0, 0, 0,
NaN, 0, NaN, 0, 0, 0.166666666666667, 0.5, 0, 0, 0.333333333333333,
0, 0, 0, 0, 0, 0, 0, 0.75, NaN, 0.25, 0, 0, 0.2, 0.5, 0, 0, 0,
0), e_d = c(0, NaN, 0, 0, 0, 0, 0, 0, 0, 0, 0, NaN, 0, NaN,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NaN, 0, 0, 0, 0,
0, 0, 0, 0, 0), e_a = c(0, NaN, 0.5, 0, 0, 0, 0, 0.333333333333333,
0, 0, 0, NaN, 0, NaN, 0, 0, 0.166666666666667, 0.25, 0, 0, 0.333333333333333,
0, 0, 0, 0, 0, 0, 0, 0.25, NaN, 0.25, 0, 0, 0.2, 0.5, 0, 0.166666666666667,
0, 0)), row.names = c(NA, -39L), class = "data.frame")
Желаемый результат будет следующим, однако, когда я использую gather
, значение объема - это общее количество строк и повторяется для всех категорий. Числовые значения будут средними значениями каждой переменной для конкретной категории (например, среднее значение 'e_j', где 'a' равно TRUE в наборе данных)
e_j e_t e_f e_s e_a e_d category
1 0.31 0.54 0.00 0.09 0.05 0.00 a
2 0.28 0.50 0.03 0.09 0.09 0.00 b
3 0.25 0.52 0.01 0.12 0.09 0.00 c
4 0.25 0.51 0.00 0.12 0.10 0.00 d
5 0.25 0.52 0.01 0.12 0.09 0.00 e
6 0.32 0.49 0.00 0.09 0.07 0.00 f