Вы можете использовать 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)
}