Я предполагаю, что кто-то, более свободно владеющий всеми функциями тидиверса, придет и предложит более компактный способ ответить на вопросы. Но пока вот простой способ решения вашей проблемы с использованием dplyr
для некоторых из них.
Чтобы начать замечать, что я добавил столбец, представляющий номера корзин в цифровом виде, это просто делает поднаборы немного более удобными. Затем я создал фрейм данных с отсутствующими значениями с размерами желаемого фрейма выходных данных.
Затем я перебрал различные номера корзин, затем использовал dplyr::filter
и dplyr::pull()
, чтобы получить вектор фруктов в каждой корзине. Затем я сделал еще один цикл, где я получил вектор фруктов в каждой другой корзине и подсчитал, сколько было общих фруктов.
В конце цикла я заменил столбец в пустом фрейме данных на вектор общих фруктов для этого номера корзины. В конце я поменял столбцы, чтобы сделать их более понятными.
library(dplyr)
fruit_basket <- data.frame("fruit" = c("apple", "grapes", "banana", "grapes", "mangos", "apple", "mangos", "banana"),
"basket" = c("one", "one", "two", "two", "three", "three", "four", "four"),
stringsAsFactors = FALSE)
fruit_basket$basket_number <- c(rep(1, 2), rep(2, 2), rep(3, 2), rep(4, 2))
output_df <- data.frame(matrix(NA, nrow = 4, ncol = 4))
for (i in 1:max(fruit_basket$basket_number)) {
fruits_in_current_basket <- fruit_basket %>%
filter(basket_number == i) %>%
pull(fruit)
basket_count <- c()
for (j in 1:4) {
if (j == i) {
shared_fruits <- 2
}
else {
fruits_in_comparison_basket <- fruit_basket %>%
filter(basket_number == j) %>%
pull(fruit)
shared_fruits <- sum(fruits_in_current_basket %in% fruits_in_comparison_basket)
}
basket_count <- c(basket_count, shared_fruits)
}
output_df[, i] <- basket_count
}
colnames(output_df) <- c("basket_one", "basket_two", "basket_three", "basket_four")