【问题标题】:All possible subpopulations from more than one variable [duplicate]来自多个变量的所有可能亚群[重复]
【发布时间】:2020-11-13 02:27:18
【问题描述】:

我有这样的数据

v1    = sample(c("a","b"), 1000, replace = T)
v2    = sample(c("c","d"), 1000, replace = T)
X     = cbind(v1, v2)

即两个变量,每个变量可以取两个值。目标是生成一个索引或类似的东西,以根据这两个变量将此数据子集到所有可能的子集中。这九个子集可以使用以下条件来描述(稍微滥用符号):

#1# (a    ) & (c    )
#2# (a    ) & (    d)
#3# (    b) & (c    )
#4# (    b) & (    d)
#5# (a    ) & (c | d)
#6# (    b) & (c | d)
#7# (a | b) & (c    )
#8# (a | b) & (    d)
#9# (a | b) & (c | d)

也就是说,子集#1 应该满足(var1 == "a") & (var2 == "c"),子集#5 应该满足var1 == "a",而子集#9 对应于完整的数据集,依此类推。

这个问题可能与this 密切相关,我怀疑我想要的可以使用combn() 来完成。但是,我无法弄清楚如何将其中的答案扩展到我的问题的多个变量。

使用硬编码循环解决这个特定问题绝对是可能的(同时也非常不优雅)。但是,该解决方案应该推广到更多变量和每个变量的不同数量的值。因此,这很快变得不可行。

编辑:在另一个线程中找到答案,将此标记为重复。

【问题讨论】:

  • 我不明白只有两个变量(var1var2)如何实现a & b & c & d
  • 我认为应该读作(a | b) & (c | d)
  • 这对我来说是个糟糕的符号,点了。 a & b & c & d 应该是指“整个数据集”,即@Bas 所说的。我认为我提供的表格可能比完整的逻辑语句更易于阅读。
  • 我编辑了我的原始帖子并包含了比我最初提供的更有意义的逻辑陈述。

标签: r indexing subset


【解决方案1】:

您并没有真正描述您想要的输出格式,但这里是一个 data.frame,其中两列代表两个变量的组合。我将您的初始对象转换为 data.frame,因为我假设您正在使用它,并且它更自然地适合此操作。

请注意,我的解决方案或多或少是一个嵌套循环,将for 替换为lapply

varList <-
lapply(X, function(s) {
  s <- sort(unique(s))
  unlist(lapply(seq_along(s), function(n) combn(s, n, paste, collapse=" ")))
})

在这里,遍历列,获取每列的唯一值,并使用lapplycombn 获取变量级别的所有组合。如果您想让这些更结构化,您可以尝试使用list 而不是paste

接下来获取每个列表元素的组合以返回最终结果。

expand.grid(varList)

返回

   v1  v2
1   a   c
2   b   c
3 a b   c
4   a   d
5   b   d
6 a b   d
7   a c d
8   b c d
9 a b c d

变量是因子。您可以使用expand.grid 中的stringsAsFactors 参数将它们转换为字符串。

【讨论】:

  • 感谢您的回答。不幸的是,lapply() 返回一个长度为 2000 的列表,其中只包含我自己的数据。
  • 此外,我想要的输出是列表中的九个数据子集。
猜你喜欢
  • 2019-07-16
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多