Метки для значений, рассчитанных по списку в 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)