Метки для значений, рассчитанных по списку в R

Пример данных:

#Referece set
Newyork <- c("ant", "bat", "cat", "dog", "unicorn", "camel", "snake", "monkey", "donkey")
Tokyo <-    c("unicorn")
Yokohama <- c("ant", "bat", "cat", "dog")
Chicago <- c("bird", "ant", "bat", "cat", "bear", "dog", "snake", "monkey", "mouse", " donkey", "octopus", "camel")
Nashville <-c("ant", "bat", "octopus") 
DC <-   c("ant", "dog", "cat", "bird")
Boston <-   c("ant", "bird", "cat", "bear", "camel", "snake", "mouse", "octopus")

#query set
Elendel <- c("wolf", "dog" ,"ant")

#combining References
Refcities <- list(Boston, Chicago, DC, Nashville, Newyork, Tokyo, Yokohama)

Код:

#outersect
outersect <- function(x, y) {
  big.vec <- c(x, y)
  duplicates <- big.vec[duplicated(big.vec)]
  setdiff(big.vec, unique(duplicates))
}

#combining intersect and outersect for unweighted similarity
unweighted <- function(x, y,...){
   len.inter <- length (intersect(x, y))
   len.outer <- length (outersect(x, y))
   len.add <- len.inter-len.outer
   len.add
}

#single line recursive    
UWshort <- function(x, y) {
  i <- y
  countermax <- length(Refcities)
  while (i <= countermax) {
    print (unweighted (x, Refcities[[i]]))
  i = i+1 }
}

UWshort(Elendel, 1)

У меня есть приведенный выше код, который дает мне число, равное (количество общих животных) - (количество не общих) для сравнения животных в одном городе с 7 контрольными городами.

Результаты ниже:

[1] -8
[1] -9
[1] -1
[1] -3
[1] -6
[1] -4
[1] -1

Как мне добавить обратно в город ссылки и отсортировать их в числовом порядке в соответствии с результатом?

Идеальный результат будет выглядеть так:

    City      Score
[1] DC        -1
[2] Yokohama  -1
[3] Nashville -3
[4] Tokyo     -4
[5] Newyork   -6
[6] Boston    -8
[7] Chicago   -9

2 ответа

Это вернет названия городов в виде имен строк, но это будет легко, если вы предпочитаете, чтобы это был столбец

Refcities <- list(Boston=Boston, Chicago=Chicago, DC=DC, Nashville=Nashville, Newyork=Newyork, Tokyo=Tokyo, Yokohama=Yokohama)

score <- sort(sapply(Refcities, unweighted, Elendel), decreasing = TRUE)

df1 <- data.frame(score)

> df1
          score
DC           -1
Yokohama     -1
Nashville    -3
Tokyo        -4
Newyork      -6
Boston       -8
Chicago      -9

Держите ваши outersect функции, но затем идите к tidyverse,

#outersect
outersect <- function(x, y) {
big.vec <- c(x, y)
duplicates <- big.vec[duplicated(big.vec)]
setdiff(big.vec, unique(duplicates))
}

#Reference set
Newyork <- c("ant", "bat", "cat", "dog", "unicorn", "camel", "snake", "monkey", "donkey")
Tokyo <-    c("unicorn")
Yokohama <- c("ant", "bat", "cat", "dog")
Chicago <- c("bird", "ant", "bat", "cat", "bear", "dog", "snake", "monkey", "mouse", " donkey", "octopus", "camel")
Nashville <-c("ant", "bat", "octopus") 
DC <-   c("ant", "dog", "cat", "bird")
Boston <-   c("ant", "bird", "cat", "bear", "camel", "snake", "mouse", "octopus")

#query set
Elendel <- c("wolf", "dog" ,"ant")

library(tidyverse)
#combining References
cities <- c('Boston', 'Chicago', 'DC', 'Nashville', 'Newyork', 'Tokyo', 'Yokohama')
Refcities <- list(Boston = Boston
                  , Chicago = Chicago
                  , DC = DC
                  , Nashville = Nashville
                  , Newyork = Newyork
                  , Tokyo = Tokyo
                  , Yokohama = Yokohama)

df <- data_frame(City = cities
                     , inter = sapply(Refcities, function(x) {
                         length(intersect(x, Elendel))
                         })
                     , outer = sapply(Refcities, function(x){
                         length(outersect(x, Elendel))
                         })
                     ) %>%
  mutate(Score = inter - outer) %>%
  arrange(desc(Score)) %>% select(City, Score)
Другие вопросы по тегам