У меня есть вопрос, где у меня есть некоторые проблемы с его решением. У меня есть фрейм данных, в котором я собрал в каждой строке 4 метки и соответствующие значения оценок. Вот мои образцы данных:
sample = data.frame("label1" = c("name1", "name1", "name3"), "score1" = c(0.88, 0.5, 0.4),
"label2" = c("name1", "name1", "name3"), "score2" = c(0.93, 0.6, 0.35),
"label3" = c("name2", "name1", "name4"), "score3" = c(0.49, 0.7, 0.8),
"label4" = c("name2", "name2", "name1"), "score4" = c(0.81, 0.8, 0.25), stringsAsFactors = FALSE)
Теперь я хотел бы рассчитать для каждой строки окончательную метку и оценить по следующим правилам:
- если метка появляется более 2 раз, то это последняя метка, и соответствующее значение является средним значением оценок этой метки.
- если в одной строке есть две разные метки, которые обе появляются два раза, то следует выбрать метку с более высоким средним значением оценки с соответствующим средним значением оценки.
- если подряд более двух разных меток, непонятно, какую из них выбрать. Таким образом, должно быть NA, и соответствующее значение также NA.
Я подумал о циклическом просмотре кадра данных за строкой и реструктуризации строки для использования aggregate
. Вот мой подход к первой строке:
pairs <- as.data.frame(matrix(as.vector(sample[1,]), ncol=2, byrow = TRUE))
pairs = data.frame("label" = unlist(pairs[,1], recursive = FALSE), "score" = unlist(pairs[,2], recursive = FALSE))
pairs$label = as.character(pairs$label)
aggregate(score~label, data=pairs, FUN = function(x) c(mean = mean(x), count = length(x) ))
После этого момента я понятия не имею, как реализовать вышеуказанные правила. Может быть, есть более эффективный способ решить эту проблему? Это мой желаемый результат:
result = data.frame("label" = c("name1", "name1", NA), "score" = c(0.905, 0.6, NA))
заранее спасибо
lapply(1:nrow(sample), function(n) sample[n,,drop=F]) %>% lapply(matrix, ncol = 2, byrow = T) %>% lapply(as.data.frame)
- person Vlo   schedule 22.02.2018