gpt4 book ai didi

r - 如何使用 R 识别存储在数据框中的列中的二进制变量的不同组合

转载 作者:行者123 更新时间:2023-12-05 04:21:52 26 4
gpt4 key购买 nike

我有一个数据框,其中每一行代表一个单独的标识符和一系列带有标志的列,这些标志代表与该标识符相关的某些特征。这些特性不是相互排斥的,一个标识符可以具有一个或多个特性。我们称它们为 a, b, c。我有兴趣了解数据中存在这些特征的哪些组合,即 a, b, c, a+b, a+c, b+c, a+b+c 发生了吗?

使用 R,我可以在一个漂亮的小 tidyverse case_when 管道中对此进行编码...但是,我正在寻找一种可以针对更多特征进行扩展的解决方案。一旦您添加更多列,可能性的数量就会呈指数级增长,硬编码变得不切实际并且容易出错。

我在这里汇总了一些示例数据...

set.seed(100)

example_data <- data.frame(
id = (1:20),
a = sample(0:1, replace = TRUE, size = 20),
b = sample(0:1, replace = TRUE, size = 20),
c = sample(0:1, replace = TRUE, size = 20),
d = sample(0:1, replace = TRUE, size = 20),
e = sample(0:1, replace = TRUE, size = 20),
f = sample(0:1, replace = TRUE, size = 20))

连同我想要的输出的模型。

combination count
a 1
b 0
c 4
...
a+b 2
a+c 0
a+d 0
a+e 0
a+f 1
a+b+c 0
a+b+d 0
a+b+e 1
a+b+f 0
a+c+d 1
a+c+e 0
...
a+b+c+d+e 1
...
a+b+c+d+e+f 1
...

我什至不知道如何解决这个问题,如果有任何提示、建议或使用 R 的潜在解决方案,我将不胜感激。如果您能够使用 tidyverse,我会加分。

最佳答案

你可以试试:

library(dplyr)
library(tidyr)
library(purrr)

# Create combination labels
labs <- setdiff(names(example_data), "id") %>%
map(seq_along(.), combn, x = ., paste, collapse = "+") %>%
unlist()

# Create combinations and count
example_data %>%
pivot_longer(-id) %>%
filter(value == 1) %>%
group_by(id) %>%
summarise(cmbs = map(1:n(), combn, x = name, FUN = paste, collapse = "+"), .groups = "drop") %>%
unnest(cmbs) %>%
mutate(cmbs = factor(cmbs, levels = labs)) %>% # Convert to factor so absent combinations aren't lost when counting
count(cmbs, .drop = FALSE) %>% # Need to use .drop = FALSE argument to prevent zero counts being dropped
arrange(cmbs)

# A tibble: 63 × 2
cmbs n
<fct> <int>
1 a 12
2 b 12
3 c 7
4 d 9
5 e 10
6 f 10
7 a+b 8
8 a+c 3
9 a+d 5
10 a+e 4
# … with 53 more rows
# ℹ Use `print(n = ...)` to see more rows

关于r - 如何使用 R 识别存储在数据框中的列中的二进制变量的不同组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74138961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com