如何在其他列的所有组合中改变新列?
How to mutate new columns across all combinations of other columns?
我的出发点是 ggraph 包中的辉格党数据。它包含一个关联矩阵。
现在,对于 columns/variables 的每个组合,我想知道是否所有列都为 1,如果确实所有列都为 1,则用 1 为该组合创建一个新列如果不是,则为 0。
辉格党的数据只是一个例子:我正在寻找一种矢量化的方法,无论 columns/combinations 的数量如何都可以使用。
使用 dplyr,我可以在 mutate()
函数中使用 across()
来创建多个新列,但我不知道如何根据各种组合创建这些列列。
同样使用 dplyr,我可以在 mutate()
函数中使用 c_across()
,与 rowwise()
函数一起,根据多列中的值创建一个新列.
也许这两者可以以某种方式结合?
你可以试试
library(dplyr)
df <- data.frame(A = rep(0, 4),
B = c(1, 0, 0, 1),
C = c(0, 1, 1, 0),
D = c(0, 1, 1 ,1))
cols <- 1:ncol(df)
combs <- unlist(sapply(cols[-1], function(x) {
asplit(combn(cols, m = x), 2)
}), recursive = FALSE)
lapply(combs, function(x) {
df <<- df %>% mutate(!!paste0(x, collapse = "/") := as.numeric(rowSums(df[, x]) == length(x)))
})
我们按索引创建列的所有组合,并对每个组合应用一个函数,该函数通过检查行总和来检查这些列的所有值是否都等于 1。如果是这样,我们添加一个名为“x/y/z...”的新列,其中 x、y 和 z 是比较的列的索引,等于 1,否则为 0。
小心,当列数增加时,这是非常昂贵的。
A B C D 1/2 1/3 1/4 2/3 2/4 3/4 1/2/3 1/2/4 1/3/4 2/3/4 1/2/3/4
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0
3 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0
4 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
我的出发点是 ggraph 包中的辉格党数据。它包含一个关联矩阵。
现在,对于 columns/variables 的每个组合,我想知道是否所有列都为 1,如果确实所有列都为 1,则用 1 为该组合创建一个新列如果不是,则为 0。
辉格党的数据只是一个例子:我正在寻找一种矢量化的方法,无论 columns/combinations 的数量如何都可以使用。
使用 dplyr,我可以在 mutate()
函数中使用 across()
来创建多个新列,但我不知道如何根据各种组合创建这些列列。
同样使用 dplyr,我可以在 mutate()
函数中使用 c_across()
,与 rowwise()
函数一起,根据多列中的值创建一个新列.
也许这两者可以以某种方式结合?
你可以试试
library(dplyr)
df <- data.frame(A = rep(0, 4),
B = c(1, 0, 0, 1),
C = c(0, 1, 1, 0),
D = c(0, 1, 1 ,1))
cols <- 1:ncol(df)
combs <- unlist(sapply(cols[-1], function(x) {
asplit(combn(cols, m = x), 2)
}), recursive = FALSE)
lapply(combs, function(x) {
df <<- df %>% mutate(!!paste0(x, collapse = "/") := as.numeric(rowSums(df[, x]) == length(x)))
})
我们按索引创建列的所有组合,并对每个组合应用一个函数,该函数通过检查行总和来检查这些列的所有值是否都等于 1。如果是这样,我们添加一个名为“x/y/z...”的新列,其中 x、y 和 z 是比较的列的索引,等于 1,否则为 0。 小心,当列数增加时,这是非常昂贵的。
A B C D 1/2 1/3 1/4 2/3 2/4 3/4 1/2/3 1/2/4 1/3/4 2/3/4 1/2/3/4
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0
3 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0
4 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0