У меня есть фрейм данных:
df = data.frame(temperature = c(rep("1", 3), rep("2", 5), rep("3", 2)), var1 = c(rep("apple", 5), rep("banana", 5)), var2 = c(rep("aardvark", 2), rep("baboon", 3), NA, rep("coyote", 4)), var3 = c(NA,rep("cherry", 6), rep("dodo", 3)))
и хотите сгруппировать по температуре и найти наиболее общий уровень коэффициента во всех столбцах для каждой температуры и указать количество значений, как показано ниже:
Я пытался изменить решения из R: найти наиболее частый уровень фактора в каждой группе отдельно для каждого столбца и поиграть с суммированием и поперек, но безуспешно.
Любая помощь очень ценится
Один из способов — повернуть.
Без связей:
pivot_longer(df, -temperature) |>
filter(!is.na(value)) |>
group_by(temperature) |>
count(value) |>
slice_max(n, with_ties = FALSE)
# A tibble: 3 × 3
# Groups: temperature [3]
temperature value n
<chr> <chr> <int>
1 1 apple 3
2 2 cherry 4
3 3 banana 2
С галстуками:
pivot_longer(df, -temperature) |>
filter(!is.na(value)) |>
group_by(temperature) |>
count(value) |>
slice_max(n, with_ties = TRUE)
# A tibble: 6 × 3
# Groups: temperature [3]
temperature value n
<chr> <chr> <int>
1 1 apple 3
2 1 cherry 3
3 2 cherry 4
4 3 banana 2
5 3 coyote 2
6 3 dodo 2
Даже после вашего редактирования ответ остается прежним. Примерьте свои реальные данные, добавив filter
(см. редактирование).
Вот и всё, спасибо :)
foo_mode <- function(x) {
freq <- table(x)
data.frame(most_common = names(freq)[which.max(freq)], occurences = max(freq))
}
split(df[paste0("var", 1:3)], df$temperature) |>
lapply(\(x) foo_mode(unlist(x))) |>
dplyr::bind_rows(.id = "temperature")
# temperature most_common occurences
# 1 1 apple 3
# 2 2 cherry 4
# 3 3 banana 2
Базовое решение R
do.call(
rbind,
lapply(
split(df, ~temperature),
\(x) {
cbind(
temperature = x[[1]][1],
setNames(
rev(stack(tail(sort(table(t(x[-1]))), 1))),
c("most_common", "count")
)
)
}
)
)
дает
temperature most_common count
1 1 apple 3
2 2 cherry 4
3 3 dodo 2
>
Спасибо, похоже, с моим набором данных это не сработало — все значения в столбце значений были NA. Не уверен, что это потому, что у меня в наборе данных много значений NA. Обновил пример df, чтобы он содержал NA.