我有一个数据框,其中包含许多变量和观察值的百分比值,如下所示:
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/