Можно использовать combn
из base R
out <- do.call(rbind, combn(rownames(df1), 2, FUN = function(x)
apply(df1[x, ], 2, paste, collapse="/"), simplify = FALSE))
row.names(out) <- combn(rownames(df1), 2, FUN = paste, collapse="_")
out
# sample1 sample2 sample3
#gene1_gene2 "2/23" "23/53" "323/56"
#gene1_gene3 "2/565" "23/55" "323/13"
#gene2_gene3 "23/565" "53/55" "56/13"
Если нам нужны фактические значения, просто замените paste
на
out <- do.call(rbind, combn(rownames(df1), 2, FUN = function(x)
apply(df1[x, ], 2, FUN = function(x) x[1]/x[2]), simplify = FALSE))
row.names(out) <- combn(rownames(df1), 2, FUN = paste, collapse="_")
out
# sample1 sample2 sample3
#gene1_gene2 0.086956522 0.4339623 5.767857
#gene1_gene3 0.003539823 0.4181818 24.846154
#gene2_gene3 0.040707965 0.9636364 4.307692
данные
df1 <- structure(list(sample1 = c(2L, 23L, 565L), sample2 = c(23L, 53L,
55L), sample3 = c(323L, 56L, 13L)), class = "data.frame",
row.names = c("gene1",
"gene2", "gene3"))