Как написать попарное сходство с файлом в R программировании - PullRequest
0 голосов
/ 03 октября 2018

У меня есть файл вкладки: string.tab, который содержит некоторые мысли, как показано ниже

Entry   String
Dog  cube;funny;smart
Cat  tiny;cube;black
....

У меня также есть пакет Sim() для вычисления сходства между двумя векторами строки.Например,

# here is demo to show how Sim() works
a = c("cs", "funny")
b = c("math", "cool")
score = Sim(a,b)
# output: 0.156

Детали Sim() не важны.Это просто инструмент для анализа текста.

Вот мой код:

data <- read.table("string.tab", sep="\t", header=TRUE)

Теперь string.tab хранится в данных.

Моя цель - вычислить все попарноСходство Entry в string.tab

Выходной файл result должен выглядеть примерно так:

Entry1 Entry2 Score
dog cat 0.132
...
...

Какой быстрый способ сделать это?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Самым простым было бы написать цикл for.

Я собираюсь предположить, что у вас есть какой-то метод / функция для создания вектора из data$String с учетом индекса.В этом примере я назову функцию extract()

 l <- nrow(data)
 n <- choose(l, 2) # number of combinations made
 entry <- data$entry
 result <- data.frame(Entry1 = rep("",n), Entry2 = rep("",n), Score = rep(0,n))
#make combination data
.comb <- data.frame(Entry1 = rep(0,n), Entry2 = rep(0,n))

#Entry1 list
.comb$Entry1 <- unlist(mapply(FUN = rep, x = 1:l, times = (l-1):0))
#Entry2 list
.c <- c(2:l)
if(l>2){
  for(i in 3:l) {
  .c <- c(.c,i:l)
  }
}
.comb$Entry2 <- .c


for(i in 1:n) {
   result[i,"Entry1"] <- data$Entry1[.comb[i,"Entry1"]]
   result[i,"Entry2"] <- data$Entry2[.comb[i,"Entry2"]]
   e.1 <- extract(data$String[.comb[i,"Entry1"]])
   e.2 <- extract(data$String[.comb[i,"Entry2"]])
   result[i, "Score"] <- Sim(e.1,e.2)
}
0 голосов
/ 03 октября 2018

Вы можете использовать combn(seq(nrow(df)), 2), чтобы получить все комбинации длины 2 (пары) номеров строк.Затем вы можете apply через эти пары функцию, которая создает data.frame для этой пары, а затем rbind результаты вместе.

Затем вы можете сохранить это как R файл данных с помощью saveRDS, как CSV с write.csv и т. Д.

df[] <- lapply(df, as.character)

splits <- lapply(df$String, strsplit, ';')

pairs <- 
apply(utils::combn(seq(nrow(df)), 2), 2, function(x){
  data.frame(Entry1 = df$Entry[x[1]], Entry2 = df$Entry[x[2]], 
             Score = do.call(Sim, splits[x]))
})

pairs.df <- do.call(rbind, pairs)
pairs.df
#   Entry1 Entry2     Score
# 1    Dog    Cat 0.5791888
# 2    Dog  human 0.7434178
# 3    Cat  human 0.4850377

saveRDS(pairs.df, '/path/to/save/file.RDS')
#or
write.csv(pairs.df, '/path/to/save/file.csv')

Используемые данные / функции

df <- structure(list(Entry = structure(c(2L, 1L, 3L), .Label = c("Cat", "Dog", "human"), class = "factor"), String = structure(c(1L, 3L, 2L), .Label = c("cube;funny;smart", "man;women", "tiny;cube;black" ), class = "factor")), row.names = c(NA, 3L), class = "data.frame")


Sim <- function(x, y){ # example since I don't have real Sim
  set.seed(sum(nchar(x) + nchar(y)))
  runif(1)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...