Сначала мы убедимся, что уровни во всех столбцах фрейма данных совпадают, и убираем их, чтобы получить числовые значения.
(d2 <- sapply(d, function(x) as.numeric(factor(x, levels=sort(unique(unlist(d)))))))
# col_1 col_2 col_3 col_4 col_5
# [1,] 5 10 5 16 5
# [2,] 3 12 3 14 3
# [3,] 4 7 4 18 4
# [4,] 6 9 6 15 6
# [5,] 1 11 1 17 1
# [6,] 2 8 2 13 2
Затем мы можем применить toString
к столбцам, разложить их на множители и разделитьих на уровне факторов;нам нужны только names
,
n <- lapply(split(m <- factor(apply(d2, 2, toString)), m), names)
, что на самом деле является результатом того, что мы rbind
вместе с их length
s.
res <- do.call(rbind, lapply(n, function(x) cbind(toString(x), length(x))))
res
# [,1] [,2]
# [1,] "col_2" "1"
# [2,] "col_4" "1"
# [3,] "col_1, col_3, col_5" "3"
Наконец, мы можем захотетьчтобы придать матрице какой-то смысл dimnames
.
dimnames(res) <- list(paste("Lineup", LETTERS[1:nrow(res)]), c("col", "n"))
res
# col n
# Lineup A "col_2" "1"
# Lineup B "col_4" "1"
# Lineup C "col_1, col_3, col_5" "3"
Примечание: Если у вас более 26 составов, вы можете захотеть сделать просто 1:nrow(res)
вместо LETTERS[1:nrow(res)]
.