R:从5个元素组合的数据帧中提取内部更高级别的组合(由1、2、3和4个元素组成的组)
抱歉,我必须在和上发布另一个问题 虽然第二个问题的答案完美地解决了MWE问题,但在我的真实数据中,我需要做一些不同的事情,并且想知道是否有人可以提供帮助 所以这一次,我的出发点是一个名为plusminus_df的数据帧,由5个元素的组合组成,实际上它可以是1到n,形式如下:R:从5个元素组合的数据帧中提取内部更高级别的组合(由1、2、3和4个元素组成的组),r,dataframe,combinations,R,Dataframe,Combinations,抱歉,我必须在和上发布另一个问题 虽然第二个问题的答案完美地解决了MWE问题,但在我的真实数据中,我需要做一些不同的事情,并且想知道是否有人可以提供帮助 所以这一次,我的出发点是一个名为plusminus_df的数据帧,由5个元素的组合组成,实际上它可以是1到n,形式如下: > markers=LETTERS[1:5] > plusminus_df <- expand.grid(lapply(seq(markers), function(x) c("+",&
> markers=LETTERS[1:5]
> plusminus_df <- expand.grid(lapply(seq(markers), function(x) c("+","-")), stringsAsFactors=FALSE)
> names(plusminus_df)=LETTERS[1:5]
> head(plusminus_df)
A B C D E
1 + + + + +
2 - + + + +
3 + - + + +
4 - - + + +
5 + + - + +
6 - + - + +
将1个标记+和-,2个标记,3个,4个和5个标记的所有可能组合与原始标记一样,用NA填充未使用的标记
因此,答案很好地从零开始构建这个期望的最终数据帧,仅从原始标记向量开始。但在我的现实世界中,我实际上可以以上面的plusminus_df的形式检索到一个由5个标记组合组成的筛选列表。。。从这个数据帧中获得所需数据帧的最直接、最有效的方法是什么,而不必处理杂乱的嵌套循环?更新
我几天前就该问这个问题了。从5个标记的筛选列表中获得所需的数据帧是什么意思?我的解决方案与这里的其他答案不同,因为,例如,如果您有一个这样的筛选列表
A B
- -
+ +
然后它只允许输出中的以下组合
A B
- NA
NA -
- -
+ NA
NA +
+ +
请注意,您永远不会得到+-或-+,因为它们不是筛选列表中显示的组合
据我所知,其他答案从来没有考虑过这个问题。将expand.grid或其他类似函数应用于A和B中的唯一条目会在输出中产生+-和-+。我的回答效率非常低,因为我不知道如何有效地解决这个问题。如果我误解了你的问题,请忽略我的回答
然而,也许你应该澄清这一点
原始答案
这是你想要的吗
# First, expand each row to a dataframe of all possible combinations;
# use `head(..., -1L)` to drop the last combination, which is just a row of NAs.
# Then, select only those unique combinations in the resultant dataframe.
library(dplyr)
out <- unique(bind_rows(apply(
sample.df, 1L,
function(r) head(expand.grid(lapply(r, c, NA_character_), stringsAsFactors = FALSE), -1L)
)))
row.names(out) <- NULL
输出如下所示
A B C D E
1 - - + - +
2 <NA> - + - +
3 - <NA> + - +
4 <NA> <NA> + - +
5 - - <NA> - +
6 <NA> - <NA> - +
7 - <NA> <NA> - +
8 <NA> <NA> <NA> - +
9 - - + <NA> +
10 <NA> - + <NA> +
11 - <NA> + <NA> +
12 <NA> <NA> + <NA> +
13 - - <NA> <NA> +
14 <NA> - <NA> <NA> +
15 - <NA> <NA> <NA> +
16 <NA> <NA> <NA> <NA> +
17 - - + - <NA>
18 <NA> - + - <NA>
19 - <NA> + - <NA>
20 <NA> <NA> + - <NA>
21 - - <NA> - <NA>
22 <NA> - <NA> - <NA>
23 - <NA> <NA> - <NA>
24 <NA> <NA> <NA> - <NA>
25 - - + <NA> <NA>
26 <NA> - + <NA> <NA>
27 - <NA> + <NA> <NA>
28 <NA> <NA> + <NA> <NA>
29 - - <NA> <NA> <NA>
30 <NA> - <NA> <NA> <NA>
31 - <NA> <NA> <NA> <NA>
32 + - + + -
33 <NA> - + + -
34 + <NA> + + -
35 <NA> <NA> + + -
36 + - <NA> + -
37 <NA> - <NA> + -
38 + <NA> <NA> + -
39 <NA> <NA> <NA> + -
40 + - + <NA> -
41 <NA> - + <NA> -
42 + <NA> + <NA> -
43 <NA> <NA> + <NA> -
44 + - <NA> <NA> -
45 <NA> - <NA> <NA> -
46 + <NA> <NA> <NA> -
47 <NA> <NA> <NA> <NA> -
48 + - + + <NA>
49 <NA> - + + <NA>
50 + <NA> + + <NA>
51 <NA> <NA> + + <NA>
52 + - <NA> + <NA>
53 <NA> - <NA> + <NA>
54 + <NA> <NA> + <NA>
55 <NA> <NA> <NA> + <NA>
56 + - + <NA> <NA>
57 + <NA> + <NA> <NA>
58 + - <NA> <NA> <NA>
59 + <NA> <NA> <NA> <NA>
60 + + + + -
61 <NA> + + + -
62 + + <NA> + -
63 <NA> + <NA> + -
64 + + + <NA> -
65 <NA> + + <NA> -
66 + + <NA> <NA> -
67 <NA> + <NA> <NA> -
68 + + + + <NA>
69 <NA> + + + <NA>
70 + + <NA> + <NA>
71 <NA> + <NA> + <NA>
72 + + + <NA> <NA>
73 <NA> + + <NA> <NA>
74 + + <NA> <NA> <NA>
75 <NA> + <NA> <NA> <NA>
76 + + - + -
77 <NA> + - + -
78 + <NA> - + -
79 <NA> <NA> - + -
80 + + - <NA> -
81 <NA> + - <NA> -
82 + <NA> - <NA> -
83 <NA> <NA> - <NA> -
84 + + - + <NA>
85 <NA> + - + <NA>
86 + <NA> - + <NA>
87 <NA> <NA> - + <NA>
88 + + - <NA> <NA>
89 <NA> + - <NA> <NA>
90 + <NA> - <NA> <NA>
91 <NA> <NA> - <NA> <NA>
92 + - + + +
93 <NA> - + + +
94 + <NA> + + +
95 <NA> <NA> + + +
96 + - <NA> + +
97 <NA> - <NA> + +
98 + <NA> <NA> + +
99 <NA> <NA> <NA> + +
100 + - + <NA> +
101 + <NA> + <NA> +
102 + - <NA> <NA> +
103 + <NA> <NA> <NA> +
104 + + - + +
105 <NA> + - + +
106 + <NA> - + +
107 <NA> <NA> - + +
108 + + <NA> + +
109 <NA> + <NA> + +
110 + + - <NA> +
111 <NA> + - <NA> +
112 + <NA> - <NA> +
113 <NA> <NA> - <NA> +
114 + + <NA> <NA> +
115 <NA> + <NA> <NA> +
116 - - - + +
117 <NA> - - + +
118 - <NA> - + +
119 - - <NA> + +
120 - <NA> <NA> + +
121 - - - <NA> +
122 <NA> - - <NA> +
123 - <NA> - <NA> +
124 - - - + <NA>
125 <NA> - - + <NA>
126 - <NA> - + <NA>
127 - - <NA> + <NA>
128 - <NA> <NA> + <NA>
129 - - - <NA> <NA>
130 <NA> - - <NA> <NA>
131 - <NA> - <NA> <NA>
132 - - - + -
133 <NA> - - + -
134 - <NA> - + -
135 - - <NA> + -
136 - <NA> <NA> + -
137 - - - <NA> -
138 <NA> - - <NA> -
139 - <NA> - <NA> -
140 - - <NA> <NA> -
141 - <NA> <NA> <NA> -
142 + - - - -
143 <NA> - - - -
144 + <NA> - - -
145 <NA> <NA> - - -
146 + - <NA> - -
147 <NA> - <NA> - -
148 + <NA> <NA> - -
149 <NA> <NA> <NA> - -
150 + - - <NA> -
151 + - - - <NA>
152 <NA> - - - <NA>
153 + <NA> - - <NA>
154 <NA> <NA> - - <NA>
155 + - <NA> - <NA>
156 + <NA> <NA> - <NA>
157 + - - <NA> <NA>
158 - + - + +
159 - + <NA> + +
160 - + - <NA> +
161 - + <NA> <NA> +
162 - + - + <NA>
163 - + <NA> + <NA>
164 - + - <NA> <NA>
165 - + <NA> <NA> <NA>
更新
我几天前就该问这个问题了。从5个标记的筛选列表中获得所需的数据帧是什么意思?我的解决方案与这里的其他答案不同,因为,例如,如果您有一个这样的筛选列表
A B
- -
+ +
然后它只允许输出中的以下组合
A B
- NA
NA -
- -
+ NA
NA +
+ +
请注意,您永远不会得到+-或-+,因为它们不是筛选列表中显示的组合
据我所知,其他答案从来没有考虑过这个问题。将expand.grid或其他类似函数应用于A和B中的唯一条目会在输出中产生+-和-+。我的回答效率非常低,因为我不知道如何有效地解决这个问题。如果我误解了你的问题,请忽略我的回答
然而,也许你应该澄清这一点
原始答案
这是你想要的吗
# First, expand each row to a dataframe of all possible combinations;
# use `head(..., -1L)` to drop the last combination, which is just a row of NAs.
# Then, select only those unique combinations in the resultant dataframe.
library(dplyr)
out <- unique(bind_rows(apply(
sample.df, 1L,
function(r) head(expand.grid(lapply(r, c, NA_character_), stringsAsFactors = FALSE), -1L)
)))
row.names(out) <- NULL
输出如下所示
A B C D E
1 - - + - +
2 <NA> - + - +
3 - <NA> + - +
4 <NA> <NA> + - +
5 - - <NA> - +
6 <NA> - <NA> - +
7 - <NA> <NA> - +
8 <NA> <NA> <NA> - +
9 - - + <NA> +
10 <NA> - + <NA> +
11 - <NA> + <NA> +
12 <NA> <NA> + <NA> +
13 - - <NA> <NA> +
14 <NA> - <NA> <NA> +
15 - <NA> <NA> <NA> +
16 <NA> <NA> <NA> <NA> +
17 - - + - <NA>
18 <NA> - + - <NA>
19 - <NA> + - <NA>
20 <NA> <NA> + - <NA>
21 - - <NA> - <NA>
22 <NA> - <NA> - <NA>
23 - <NA> <NA> - <NA>
24 <NA> <NA> <NA> - <NA>
25 - - + <NA> <NA>
26 <NA> - + <NA> <NA>
27 - <NA> + <NA> <NA>
28 <NA> <NA> + <NA> <NA>
29 - - <NA> <NA> <NA>
30 <NA> - <NA> <NA> <NA>
31 - <NA> <NA> <NA> <NA>
32 + - + + -
33 <NA> - + + -
34 + <NA> + + -
35 <NA> <NA> + + -
36 + - <NA> + -
37 <NA> - <NA> + -
38 + <NA> <NA> + -
39 <NA> <NA> <NA> + -
40 + - + <NA> -
41 <NA> - + <NA> -
42 + <NA> + <NA> -
43 <NA> <NA> + <NA> -
44 + - <NA> <NA> -
45 <NA> - <NA> <NA> -
46 + <NA> <NA> <NA> -
47 <NA> <NA> <NA> <NA> -
48 + - + + <NA>
49 <NA> - + + <NA>
50 + <NA> + + <NA>
51 <NA> <NA> + + <NA>
52 + - <NA> + <NA>
53 <NA> - <NA> + <NA>
54 + <NA> <NA> + <NA>
55 <NA> <NA> <NA> + <NA>
56 + - + <NA> <NA>
57 + <NA> + <NA> <NA>
58 + - <NA> <NA> <NA>
59 + <NA> <NA> <NA> <NA>
60 + + + + -
61 <NA> + + + -
62 + + <NA> + -
63 <NA> + <NA> + -
64 + + + <NA> -
65 <NA> + + <NA> -
66 + + <NA> <NA> -
67 <NA> + <NA> <NA> -
68 + + + + <NA>
69 <NA> + + + <NA>
70 + + <NA> + <NA>
71 <NA> + <NA> + <NA>
72 + + + <NA> <NA>
73 <NA> + + <NA> <NA>
74 + + <NA> <NA> <NA>
75 <NA> + <NA> <NA> <NA>
76 + + - + -
77 <NA> + - + -
78 + <NA> - + -
79 <NA> <NA> - + -
80 + + - <NA> -
81 <NA> + - <NA> -
82 + <NA> - <NA> -
83 <NA> <NA> - <NA> -
84 + + - + <NA>
85 <NA> + - + <NA>
86 + <NA> - + <NA>
87 <NA> <NA> - + <NA>
88 + + - <NA> <NA>
89 <NA> + - <NA> <NA>
90 + <NA> - <NA> <NA>
91 <NA> <NA> - <NA> <NA>
92 + - + + +
93 <NA> - + + +
94 + <NA> + + +
95 <NA> <NA> + + +
96 + - <NA> + +
97 <NA> - <NA> + +
98 + <NA> <NA> + +
99 <NA> <NA> <NA> + +
100 + - + <NA> +
101 + <NA> + <NA> +
102 + - <NA> <NA> +
103 + <NA> <NA> <NA> +
104 + + - + +
105 <NA> + - + +
106 + <NA> - + +
107 <NA> <NA> - + +
108 + + <NA> + +
109 <NA> + <NA> + +
110 + + - <NA> +
111 <NA> + - <NA> +
112 + <NA> - <NA> +
113 <NA> <NA> - <NA> +
114 + + <NA> <NA> +
115 <NA> + <NA> <NA> +
116 - - - + +
117 <NA> - - + +
118 - <NA> - + +
119 - - <NA> + +
120 - <NA> <NA> + +
121 - - - <NA> +
122 <NA> - - <NA> +
123 - <NA> - <NA> +
124 - - - + <NA>
125 <NA> - - + <NA>
126 - <NA> - + <NA>
127 - - <NA> + <NA>
128 - <NA> <NA> + <NA>
129 - - - <NA> <NA>
130 <NA> - - <NA> <NA>
131 - <NA> - <NA> <NA>
132 - - - + -
133 <NA> - - + -
134 - <NA> - + -
135 - - <NA> + -
136 - <NA> <NA> + -
137 - - - <NA> -
138 <NA> - - <NA> -
139 - <NA> - <NA> -
140 - - <NA> <NA> -
141 - <NA> <NA> <NA> -
142 + - - - -
143 <NA> - - - -
144 + <NA> - - -
145 <NA> <NA> - - -
146 + - <NA> - -
147 <NA> - <NA> - -
148 + <NA> <NA> - -
149 <NA> <NA> <NA> - -
150 + - - <NA> -
151 + - - - <NA>
152 <NA> - - - <NA>
153 + <NA> - - <NA>
154 <NA> <NA> - - <NA>
155 + - <NA> - <NA>
156 + <NA> <NA> - <NA>
157 + - - <NA> <NA>
158 - + - + +
159 - + <NA> + +
160 - + - <NA> +
161 - + <NA> <NA> +
162 - + - + <NA>
163 - + <NA> + <NA>
164 - + - <NA> <NA>
165 - + <NA> <NA> <NA>
这是一个整洁的解决方案
add_row将添加一行NAs。mapunique将获得每列的唯一值。expand.grid将把所有的组合放入一个数据框中
library(tidyverse)
plusminus_df %>%
add_row() %>%
map(unique) %>%
expand.grid()
#> A B C D E
#> 1 + + + + +
#> 2 - + + + +
#> 3 <NA> + + + +
#> 4 + - + + +
#> 5 - - + + +
#> 6 <NA> - + + +
#> 7 + <NA> + + +
#> 8 - <NA> + + +
#> 9 <NA> <NA> + + +
#> 10 + + - + +
#> 11 - + - + +
#> 12 <NA> + - + +
#> 13 + - - + +
#> 14 - - - + +
#> 15 <NA> - - + +
#> 16 + <NA> - + +
#> 17 - <NA> - + +
#> ...
这是一个整洁的解决方案
add_row将添加一行NAs。mapunique将获得每列的唯一值。expand.grid将把所有的组合放入一个数据框中
library(tidyverse)
plusminus_df %>%
add_row() %>%
map(unique) %>%
expand.grid()
#> A B C D E
#> 1 + + + + +
#> 2 - + + + +
#> 3 <NA> + + + +
#> 4 + - + + +
#> 5 - - + + +
#> 6 <NA> - + + +
#> 7 + <NA> + + +
#> 8 - <NA> + + +
#> 9 <NA> <NA> + + +
#> 10 + + - + +
#> 11 - + - + +
#> 12 <NA> + - + +
#> 13 + - - + +
#> 14 - - - + +
#> 15 <NA> - - + +
#> 16 + <NA> - + +
#> 17 - <NA> - + +
#> ...
我认为您可以直接从包gtools尝试排列
这给了你
> final_df
A B C D E
1 + + + + +
2 + + + + -
3 + + + + <NA>
4 + + + - +
5 + + + - -
6 + + + - <NA>
7 + + + <NA> +
8 + + + <NA> -
9 + + + <NA> <NA>
10 + + - + +
11 + + - + -
12 + + - + <NA>
13 + + - - +
14 + + - - -
15 + + - - <NA>
16 + + - <NA> +
17 + + - <NA> -
18 + + - <NA> <NA>
19 + + <NA> + +
20 + + <NA> + -
21 + + <NA> + <NA>
22 + + <NA> - +
23 + + <NA> - -
24 + + <NA> - <NA>
25 + + <NA> <NA> +
26 + + <NA> <NA> -
27 + + <NA> <NA> <NA>
28 + - + + +
29 + - + + -
30 + - + + <NA>
31 + - + - +
32 + - + - -
33 + - + - <NA>
34 + - + <NA> +
35 + - + <NA> -
36 + - + <NA> <NA>
37 + - - + +
38 + - - + -
39 + - - + <NA>
40 + - - - +
41 + - - - -
42 + - - - <NA>
43 + - - <NA> +
44 + - - <NA> -
45 + - - <NA> <NA>
46 + - <NA> + +
47 + - <NA> + -
48 + - <NA> + <NA>
49 + - <NA> - +
50 + - <NA> - -
51 + - <NA> - <NA>
52 + - <NA> <NA> +
53 + - <NA> <NA> -
54 + - <NA> <NA> <NA>
55 + <NA> + + +
56 + <NA> + + -
57 + <NA> + + <NA>
58 + <NA> + - +
59 + <NA> + - -
60 + <NA> + - <NA>
61 + <NA> + <NA> +
62 + <NA> + <NA> -
63 + <NA> + <NA> <NA>
64 + <NA> - + +
65 + <NA> - + -
66 + <NA> - + <NA>
67 + <NA> - - +
68 + <NA> - - -
69 + <NA> - - <NA>
70 + <NA> - <NA> +
71 + <NA> - <NA> -
72 + <NA> - <NA> <NA>
73 + <NA> <NA> + +
74 + <NA> <NA> + -
75 + <NA> <NA> + <NA>
76 + <NA> <NA> - +
77 + <NA> <NA> - -
78 + <NA> <NA> - <NA>
79 + <NA> <NA> <NA> +
80 + <NA> <NA> <NA> -
81 + <NA> <NA> <NA> <NA>
82 - + + + +
83 - + + + -
84 - + + + <NA>
85 - + + - +
86 - + + - -
87 - + + - <NA>
88 - + + <NA> +
89 - + + <NA> -
90 - + + <NA> <NA>
91 - + - + +
92 - + - + -
93 - + - + <NA>
94 - + - - +
95 - + - - -
96 - + - - <NA>
97 - + - <NA> +
98 - + - <NA> -
99 - + - <NA> <NA>
100 - + <NA> + +
101 - + <NA> + -
102 - + <NA> + <NA>
103 - + <NA> - +
104 - + <NA> - -
105 - + <NA> - <NA>
106 - + <NA> <NA> +
107 - + <NA> <NA> -
108 - + <NA> <NA> <NA>
109 - - + + +
110 - - + + -
111 - - + + <NA>
112 - - + - +
113 - - + - -
114 - - + - <NA>
115 - - + <NA> +
116 - - + <NA> -
117 - - + <NA> <NA>
118 - - - + +
119 - - - + -
120 - - - + <NA>
121 - - - - +
122 - - - - -
123 - - - - <NA>
124 - - - <NA> +
125 - - - <NA> -
126 - - - <NA> <NA>
127 - - <NA> + +
128 - - <NA> + -
129 - - <NA> + <NA>
130 - - <NA> - +
131 - - <NA> - -
132 - - <NA> - <NA>
133 - - <NA> <NA> +
134 - - <NA> <NA> -
135 - - <NA> <NA> <NA>
136 - <NA> + + +
137 - <NA> + + -
138 - <NA> + + <NA>
139 - <NA> + - +
140 - <NA> + - -
141 - <NA> + - <NA>
142 - <NA> + <NA> +
143 - <NA> + <NA> -
144 - <NA> + <NA> <NA>
145 - <NA> - + +
146 - <NA> - + -
147 - <NA> - + <NA>
148 - <NA> - - +
149 - <NA> - - -
150 - <NA> - - <NA>
151 - <NA> - <NA> +
152 - <NA> - <NA> -
153 - <NA> - <NA> <NA>
154 - <NA> <NA> + +
155 - <NA> <NA> + -
156 - <NA> <NA> + <NA>
157 - <NA> <NA> - +
158 - <NA> <NA> - -
159 - <NA> <NA> - <NA>
160 - <NA> <NA> <NA> +
161 - <NA> <NA> <NA> -
162 - <NA> <NA> <NA> <NA>
163 <NA> + + + +
164 <NA> + + + -
165 <NA> + + + <NA>
166 <NA> + + - +
167 <NA> + + - -
168 <NA> + + - <NA>
169 <NA> + + <NA> +
170 <NA> + + <NA> -
171 <NA> + + <NA> <NA>
172 <NA> + - + +
173 <NA> + - + -
174 <NA> + - + <NA>
175 <NA> + - - +
176 <NA> + - - -
177 <NA> + - - <NA>
178 <NA> + - <NA> +
179 <NA> + - <NA> -
180 <NA> + - <NA> <NA>
181 <NA> + <NA> + +
182 <NA> + <NA> + -
183 <NA> + <NA> + <NA>
184 <NA> + <NA> - +
185 <NA> + <NA> - -
186 <NA> + <NA> - <NA>
187 <NA> + <NA> <NA> +
188 <NA> + <NA> <NA> -
189 <NA> + <NA> <NA> <NA>
190 <NA> - + + +
191 <NA> - + + -
192 <NA> - + + <NA>
193 <NA> - + - +
194 <NA> - + - -
195 <NA> - + - <NA>
196 <NA> - + <NA> +
197 <NA> - + <NA> -
198 <NA> - + <NA> <NA>
199 <NA> - - + +
200 <NA> - - + -
201 <NA> - - + <NA>
202 <NA> - - - +
203 <NA> - - - -
204 <NA> - - - <NA>
205 <NA> - - <NA> +
206 <NA> - - <NA> -
207 <NA> - - <NA> <NA>
208 <NA> - <NA> + +
209 <NA> - <NA> + -
210 <NA> - <NA> + <NA>
211 <NA> - <NA> - +
212 <NA> - <NA> - -
213 <NA> - <NA> - <NA>
214 <NA> - <NA> <NA> +
215 <NA> - <NA> <NA> -
216 <NA> - <NA> <NA> <NA>
217 <NA> <NA> + + +
218 <NA> <NA> + + -
219 <NA> <NA> + + <NA>
220 <NA> <NA> + - +
221 <NA> <NA> + - -
222 <NA> <NA> + - <NA>
223 <NA> <NA> + <NA> +
224 <NA> <NA> + <NA> -
225 <NA> <NA> + <NA> <NA>
226 <NA> <NA> - + +
227 <NA> <NA> - + -
228 <NA> <NA> - + <NA>
229 <NA> <NA> - - +
230 <NA> <NA> - - -
231 <NA> <NA> - - <NA>
232 <NA> <NA> - <NA> +
233 <NA> <NA> - <NA> -
234 <NA> <NA> - <NA> <NA>
235 <NA> <NA> <NA> + +
236 <NA> <NA> <NA> + -
237 <NA> <NA> <NA> + <NA>
238 <NA> <NA> <NA> - +
239 <NA> <NA> <NA> - -
240 <NA> <NA> <NA> - <NA>
241 <NA> <NA> <NA> <NA> +
242 <NA> <NA> <NA> <NA> -
243 <NA> <NA> <NA> <NA> <NA>
我认为您可以直接从包gtools尝试排列
这给了你
> final_df
A B C D E
1 + + + + +
2 + + + + -
3 + + + + <NA>
4 + + + - +
5 + + + - -
6 + + + - <NA>
7 + + + <NA> +
8 + + + <NA> -
9 + + + <NA> <NA>
10 + + - + +
11 + + - + -
12 + + - + <NA>
13 + + - - +
14 + + - - -
15 + + - - <NA>
16 + + - <NA> +
17 + + - <NA> -
18 + + - <NA> <NA>
19 + + <NA> + +
20 + + <NA> + -
21 + + <NA> + <NA>
22 + + <NA> - +
23 + + <NA> - -
24 + + <NA> - <NA>
25 + + <NA> <NA> +
26 + + <NA> <NA> -
27 + + <NA> <NA> <NA>
28 + - + + +
29 + - + + -
30 + - + + <NA>
31 + - + - +
32 + - + - -
33 + - + - <NA>
34 + - + <NA> +
35 + - + <NA> -
36 + - + <NA> <NA>
37 + - - + +
38 + - - + -
39 + - - + <NA>
40 + - - - +
41 + - - - -
42 + - - - <NA>
43 + - - <NA> +
44 + - - <NA> -
45 + - - <NA> <NA>
46 + - <NA> + +
47 + - <NA> + -
48 + - <NA> + <NA>
49 + - <NA> - +
50 + - <NA> - -
51 + - <NA> - <NA>
52 + - <NA> <NA> +
53 + - <NA> <NA> -
54 + - <NA> <NA> <NA>
55 + <NA> + + +
56 + <NA> + + -
57 + <NA> + + <NA>
58 + <NA> + - +
59 + <NA> + - -
60 + <NA> + - <NA>
61 + <NA> + <NA> +
62 + <NA> + <NA> -
63 + <NA> + <NA> <NA>
64 + <NA> - + +
65 + <NA> - + -
66 + <NA> - + <NA>
67 + <NA> - - +
68 + <NA> - - -
69 + <NA> - - <NA>
70 + <NA> - <NA> +
71 + <NA> - <NA> -
72 + <NA> - <NA> <NA>
73 + <NA> <NA> + +
74 + <NA> <NA> + -
75 + <NA> <NA> + <NA>
76 + <NA> <NA> - +
77 + <NA> <NA> - -
78 + <NA> <NA> - <NA>
79 + <NA> <NA> <NA> +
80 + <NA> <NA> <NA> -
81 + <NA> <NA> <NA> <NA>
82 - + + + +
83 - + + + -
84 - + + + <NA>
85 - + + - +
86 - + + - -
87 - + + - <NA>
88 - + + <NA> +
89 - + + <NA> -
90 - + + <NA> <NA>
91 - + - + +
92 - + - + -
93 - + - + <NA>
94 - + - - +
95 - + - - -
96 - + - - <NA>
97 - + - <NA> +
98 - + - <NA> -
99 - + - <NA> <NA>
100 - + <NA> + +
101 - + <NA> + -
102 - + <NA> + <NA>
103 - + <NA> - +
104 - + <NA> - -
105 - + <NA> - <NA>
106 - + <NA> <NA> +
107 - + <NA> <NA> -
108 - + <NA> <NA> <NA>
109 - - + + +
110 - - + + -
111 - - + + <NA>
112 - - + - +
113 - - + - -
114 - - + - <NA>
115 - - + <NA> +
116 - - + <NA> -
117 - - + <NA> <NA>
118 - - - + +
119 - - - + -
120 - - - + <NA>
121 - - - - +
122 - - - - -
123 - - - - <NA>
124 - - - <NA> +
125 - - - <NA> -
126 - - - <NA> <NA>
127 - - <NA> + +
128 - - <NA> + -
129 - - <NA> + <NA>
130 - - <NA> - +
131 - - <NA> - -
132 - - <NA> - <NA>
133 - - <NA> <NA> +
134 - - <NA> <NA> -
135 - - <NA> <NA> <NA>
136 - <NA> + + +
137 - <NA> + + -
138 - <NA> + + <NA>
139 - <NA> + - +
140 - <NA> + - -
141 - <NA> + - <NA>
142 - <NA> + <NA> +
143 - <NA> + <NA> -
144 - <NA> + <NA> <NA>
145 - <NA> - + +
146 - <NA> - + -
147 - <NA> - + <NA>
148 - <NA> - - +
149 - <NA> - - -
150 - <NA> - - <NA>
151 - <NA> - <NA> +
152 - <NA> - <NA> -
153 - <NA> - <NA> <NA>
154 - <NA> <NA> + +
155 - <NA> <NA> + -
156 - <NA> <NA> + <NA>
157 - <NA> <NA> - +
158 - <NA> <NA> - -
159 - <NA> <NA> - <NA>
160 - <NA> <NA> <NA> +
161 - <NA> <NA> <NA> -
162 - <NA> <NA> <NA> <NA>
163 <NA> + + + +
164 <NA> + + + -
165 <NA> + + + <NA>
166 <NA> + + - +
167 <NA> + + - -
168 <NA> + + - <NA>
169 <NA> + + <NA> +
170 <NA> + + <NA> -
171 <NA> + + <NA> <NA>
172 <NA> + - + +
173 <NA> + - + -
174 <NA> + - + <NA>
175 <NA> + - - +
176 <NA> + - - -
177 <NA> + - - <NA>
178 <NA> + - <NA> +
179 <NA> + - <NA> -
180 <NA> + - <NA> <NA>
181 <NA> + <NA> + +
182 <NA> + <NA> + -
183 <NA> + <NA> + <NA>
184 <NA> + <NA> - +
185 <NA> + <NA> - -
186 <NA> + <NA> - <NA>
187 <NA> + <NA> <NA> +
188 <NA> + <NA> <NA> -
189 <NA> + <NA> <NA> <NA>
190 <NA> - + + +
191 <NA> - + + -
192 <NA> - + + <NA>
193 <NA> - + - +
194 <NA> - + - -
195 <NA> - + - <NA>
196 <NA> - + <NA> +
197 <NA> - + <NA> -
198 <NA> - + <NA> <NA>
199 <NA> - - + +
200 <NA> - - + -
201 <NA> - - + <NA>
202 <NA> - - - +
203 <NA> - - - -
204 <NA> - - - <NA>
205 <NA> - - <NA> +
206 <NA> - - <NA> -
207 <NA> - - <NA> <NA>
208 <NA> - <NA> + +
209 <NA> - <NA> + -
210 <NA> - <NA> + <NA>
211 <NA> - <NA> - +
212 <NA> - <NA> - -
213 <NA> - <NA> - <NA>
214 <NA> - <NA> <NA> +
215 <NA> - <NA> <NA> -
216 <NA> - <NA> <NA> <NA>
217 <NA> <NA> + + +
218 <NA> <NA> + + -
219 <NA> <NA> + + <NA>
220 <NA> <NA> + - +
221 <NA> <NA> + - -
222 <NA> <NA> + - <NA>
223 <NA> <NA> + <NA> +
224 <NA> <NA> + <NA> -
225 <NA> <NA> + <NA> <NA>
226 <NA> <NA> - + +
227 <NA> <NA> - + -
228 <NA> <NA> - + <NA>
229 <NA> <NA> - - +
230 <NA> <NA> - - -
231 <NA> <NA> - - <NA>
232 <NA> <NA> - <NA> +
233 <NA> <NA> - <NA> -
234 <NA> <NA> - <NA> <NA>
235 <NA> <NA> <NA> + +
236 <NA> <NA> <NA> + -
237 <NA> <NA> <NA> + <NA>
238 <NA> <NA> <NA> - +
239 <NA> <NA> <NA> - -
240 <NA> <NA> <NA> - <NA>
241 <NA> <NA> <NA> <NA> +
242 <NA> <NA> <NA> <NA> -
243 <NA> <NA> <NA> <NA> <NA>
我不能完全确定我是否理解您要查找的内容,但从第二个问题来看,您似乎在查找data.frame中所有列的交叉组合 免责声明:已经提供的两个答案更具可读性,我关注的是速度 当您执行通常称为交叉连接或外部完全连接的操作时,随着n的增加,一个方面很快成为一个问题,那就是效率。为了提高效率,可以将问题分解为更小的子问题,并为每个问题找到解决方案。由于我们需要在列集合中找到所有唯一的组合,包括null set value=NA,因此我们可以将此问题简化为两个子问题 查找每个列(包括空集)的唯一值 展开此集合以包括每列的所有组合。 利用这个想法,我们可以使用expand.grid、unique和lapply快速组合出一个简单的解决方案。唯一棘手的部分是包含空集,但我们可以通过从data.frame(包括所有行)中选择一行来实现
# Create null-set-included data.frame
nullset_df <- plusminus_df[c(NA, seq_len(nrow(plusminus_df))), ]
# Find all unique elements, including null set
unique_df <- lapply(nullset_df, unique)
# Combine all unique sets
expand.grid(unique_df)
该函数需要向量输入,迫使用户使用do.call或类似命令,这使得函数的可读性稍差。但是否有任何性能提升?为了测试这一点,我在这两个函数和下面现有答案代码提供的函数上运行了一个微基准,结果显示在下面的小提琴图中:
从情节上看,@pauls的答案明显优于@ekoam的答案,但两者
以上两个函数在速度方面都优于提供的答案。但是问题是,输入可能有任意数量的维度,因此也有一个问题,我们的函数在多大程度上与列的数量和唯一值的数量成比例,我们这里只有+和-但是如果我们有更多呢?。为此,我重新运行n_列=3,4,…,10和n_值=2,4。。。10下面用平滑曲线显示了这两个结果。
首先,我们将时间视为列数的函数。请注意,y轴位于以10为底的对数刻度上,以便于比较
从可视化可以清楚地看出,随着列数的增加,方法的选择变得非常重要。@ekoam的建议变得非常缓慢,主要是因为它将对unique的调用延迟到最后。剩下的3种方法都要快得多,而当我们获得超过8列的数据时,nullgrid.expand.dt比剩下的方法快10倍多
接下来,让我们看一下与固定为5的每列n列中的值数量相比的计时
我们再次看到类似的图片。除了nullgrid.expand的一个可能的异常值外,随着唯一值数量的增加,它似乎变得比paul的答案慢,我们看到nullgrid.expand.dt仍然更快,虽然在这里它似乎只节省了exp4-exp3.6/exp3.6~50%,或者是在我们达到10个唯一值时,与paul的答案相比快了一倍
请注意,我没有足够的RAM来运行唯一值或列数大于所示值或列数的基准测试
结论
我们已经看到有很多方法可以找到问题的答案,但是随着列数和唯一值的增加,方法的选择变得越来越重要。通过使用优化的库,我们可以大大减少获得所有列值的交叉连接所需的时间,只需最少的努力。通过使用Rcpp进行扩展,我们可能会进一步降低时间复杂度,而这超出了我的回答范围
基准代码
定时功能
我不能完全确定我是否理解您要查找的内容,但从第二个问题来看,您似乎在查找data.frame中所有列的交叉组合 免责声明:已经提供的两个答案更具可读性,我关注的是速度 当您执行通常称为交叉连接或外部完全连接的操作时,随着n的增加,一个方面很快成为一个问题,那就是效率。为了提高效率,可以将问题分解为更小的子问题,并为每个问题找到解决方案。由于我们需要在列集合中找到所有唯一的组合,包括null set value=NA,因此我们可以将此问题简化为两个子问题 查找每个列(包括空集)的唯一值 展开此集合以包括每列的所有组合。 利用这个想法,我们可以使用expand.grid、unique和lapply快速组合出一个简单的解决方案。唯一棘手的部分是包含空集,但我们可以通过从data.frame(包括所有行)中选择一行来实现
# Create null-set-included data.frame
nullset_df <- plusminus_df[c(NA, seq_len(nrow(plusminus_df))), ]
# Find all unique elements, including null set
unique_df <- lapply(nullset_df, unique)
# Combine all unique sets
expand.grid(unique_df)
该函数需要向量输入,迫使用户使用do.call或类似命令,这使得函数的可读性稍差。但是否有任何性能提升?为了测试这一点,我在这两个函数和下面现有答案代码提供的函数上运行了一个微基准,结果显示在下面的小提琴图中:
从图中可以很清楚地看出,@pauls answer优于@ekoam的答案,但上述两个函数在速度方面都优于提供的答案。但是问题是,输入可能有任意数量的维度,因此也有一个问题,我们的函数在多大程度上与列的数量和唯一值的数量成比例,我们这里只有+和-但是如果我们有更多呢?。为此,我重新运行n_列=3,4,…,10和n_值=2,4。。。10下面用平滑曲线显示了这两个结果。
首先,我们将时间视为列数的函数。请注意,y轴位于以10为底的对数刻度上,以便于比较
从可视化可以清楚地看出,随着列数的增加,方法的选择变得非常重要。@ekoam的建议变得非常缓慢,主要是因为它将对unique的调用延迟到最后。剩下的3种方法都要快得多,而当我们获得超过8列的数据时,nullgrid.expand.dt比剩下的方法快10倍多
接下来,让我们看一下与固定为5的每列n列中的值数量相比的计时
我们再次看到类似的图片。除了nullgrid.expand的一个可能的异常值之外,随着唯一值数量的增加,它似乎比paul给出的答案慢
例如,我们看到nullgrid.expand.dt仍然更快,尽管在这里它似乎只节省了exp4-exp3.6/exp3.6~50%的速度,或者是在我们达到10个唯一值时paul的答案的两倍
请注意,我没有足够的RAM来运行唯一值或列数大于所示值或列数的基准测试
结论
我们已经看到有很多方法可以找到问题的答案,但是随着列数和唯一值的增加,方法的选择变得越来越重要。通过使用优化的库,我们可以大大减少获得所有列值的交叉连接所需的时间,只需最少的努力。通过使用Rcpp进行扩展,我们可能会进一步降低时间复杂度,而这超出了我的回答范围
基准代码
定时功能
这太棒了。但我认为我的答案很慢,因为我将expand.grid应用于数据帧中的每一行,而不是因为我延迟了唯一的函数调用。另外,不需要提前调用unique,因为对于每个expand.grid操作,行在结果数据框中总是唯一的,但在所有操作中可能不是唯一的。我可以更清楚地说。在expand.grid之后应用unique的意思是,Paul提供的答案将data.frame转换为列表,并对每列的唯一元素调用expand.grid。正如您所说,您将expand.grid应用于data.frame的每一行:-我还想说,这两个答案都没有错。如果数据的大小是任意一种解决方案都可以处理的,那么唯一需要注意的是,必须重复调用函数。这很好。但我认为我的答案很慢,因为我将expand.grid应用于数据帧中的每一行,而不是因为我延迟了唯一的函数调用。另外,不需要提前调用unique,因为对于每个expand.grid操作,行在结果数据框中总是唯一的,但在所有操作中可能不是唯一的。我可以更清楚地说。在expand.grid之后应用unique的意思是,Paul提供的答案将data.frame转换为列表,并对每列的唯一元素调用expand.grid。正如您所说,您将expand.grid应用于data.frame的每一行:-我还想说,这两个答案都没有错。如果数据的大小是任意一种解决方案都可以处理的,那么需要注意的唯一原因就是必须重复调用函数。