我想data.frame在R中实现以下功能:
i1 i2 i3
1 A1 A2 A3
2 No A2 A3
3 A1 No A3
4 No No A3
5 A1 A2 No
6 No A2 No
7 A1 No No
8 No No No
Run Code Online (Sandbox Code Playgroud)
在每列中,变量可以是连接字符串"A"和列号或"否".本data.frame应包含所有可能的组合.
我的想法是使用expand.grid,但我不知道如何list动态创建.还是有更好的方法?
expand.grid(list(c("A1", "No"), c("A2", "No"), c("A3", "No")))
Run Code Online (Sandbox Code Playgroud)
我想你可以创建自己的辅助函数,就像那样
MyList <- function(n) expand.grid(lapply(paste0("A", seq_len(n)), c, "No"))
Run Code Online (Sandbox Code Playgroud)
然后简单地传递元素的数量(例如,3)
MyList(3)
# Var1 Var2 Var3
# 1 A1 A2 A3
# 2 No A2 A3
# 3 A1 No A3
# 4 No No A3
# 5 A1 A2 No
# 6 No A2 No
# 7 A1 No No
# 8 No No No
Run Code Online (Sandbox Code Playgroud)
或者,你也可以尝试相当于一个比一个大的效率更高效data.table的CJ等价物expand.gridn
library(data.table)
DTCJ <- function(n) do.call(CJ, lapply(paste0("A", seq_len(n)), c, "No"))
DTCJ(3) # will return a sorted cross join
# V1 V2 V3
# 1: A1 A2 A3
# 2: A1 A2 No
# 3: A1 No A3
# 4: A1 No No
# 5: No A2 A3
# 6: No A2 No
# 7: No No A3
# 8: No No No
Run Code Online (Sandbox Code Playgroud)