R使用combn和apply

标签 r apply combn

我有一个数据框,其中包含许多变量和观察值的百分比值,如下所示:

obs <- data.frame(Site = c("A", "B", "C"), X = c(11, 22, 33), Y = c(44, 55, 66), Z = c(77, 88, 99))

我需要将此数据准备为网络分析的边列表,其中“站点”作为节点,其余变量作为边。结果应该如下所示:

Node1    Node2    Weight  Type
A         B         33     X
A         C         44     X
...
B         C         187    Z       

因此,对于“权重”,我们正在计算所有可能对的总和,并且对每一列分别计算(最终以“类型”表示)。

我想这个问题的答案必须是在 combn 表达式上使用 apply ,就像这里 Applying combn() function to data frame ,但我还没能完全解决。

我可以通过手动组合“Site”来完成这一切

sites <- combn(obs$Site, 2)

然后各个列就像这样

combA <- combn(obs$A, 2, function(x) sum(x)

并将这些数据集绑定(bind)在一起,但这显然很快就会变得烦人。

我尝试像这样一次性完成所有变量列

b <- apply(newdf[, -1], 1, function(x){
sum(utils::combn(x, 2))
}
)

但这有问题。 请问有人可以帮忙吗?

最佳答案

一种选择是创建一个函数,然后将该函数映射到您拥有的所有列。

func1 <- function(var){
  obs %>% 
    transmute(Node1 = combn(Site, 2)[1, ],
           Node2 = combn(Site, 2)[2, ],
           Weight = combn(!!sym(var), 2, function(x) sum(x)),
           Type = var)
}

map(colnames(obs)[-1], func1) %>% bind_rows()

关于R使用combn和apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63742144/

相关文章:

r - R 中组合作为元素的梳状任务

r - 按行对选定列中的非 NA 观测值对进行计数

r - 每个数据组合的特殊组编号

r - 使用 Dplyr 将每行列右侧的所有单元格求和

javascript - 需要帮助理解 mergeSort 和 apply()

r - 在教程示例中使用 R 中的应用函数时出错

r - 如何识别输出低于某个阈值的两个变量的哪些组合?

R代码生成带前缀的唯一ID?

r - 使用 Procrustes Analysis 比较两个 3D 点云的形状

r - apply() 查找 2 个向量中最接近的值