Учитывая эти data.frame:
library(dplyr)
library(stringr)
ml.mat2 <- structure(list(value = c("a", "b", "c"), ground_truth = c("label1, label3",
"label2", "label1"), predicted = c("label1", "label2,label3",
"label1")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-3L))
glimpse(ml.mat2)
Observations: 3
Variables: 3
$ value <chr> "a", "b", "c"
$ ground_truth <chr> "label1, label3", "label2", "label1"
$ predicted <chr> "label1", "label2,label3", "label1"
Я хочу измерить длину пересечения между ground_truth
и predicted
для каждой строки после разделенияповторяющиеся метки, основанные на ,
.
Другими словами, я ожидал бы результата длины 3 со значениями 2 2 1
.
Я написал функцию, чтобы сделать это, но этотолько кажется, что работает за пределами sapply
:
m_fn <- function(x,y) length(union(unlist(sapply(x, str_split,",")),
unlist(sapply(y, str_split,","))))
m_fn(ml.mat2$ground_truth[1], y = ml.mat2$predicted[1])
[1] 2
m_fn(ml.mat2$ground_truth[2], y = ml.mat2$predicted[2])
[1] 2
m_fn(ml.mat2$ground_truth[3], y = ml.mat2$predicted[3])
[1] 1
Вместо того, чтобы перебирать строки набора данных вручную, как это или с помощью цикла, я ожидал бы иметь возможность векторизовать решение с помощью sapply
вот так:
sapply(ml.mat2$ground_truth, m_fn, ml.mat2$predicted)
Однако неожиданные результаты:
label1, label3 label2 label1
4 3 3