在行之间应用函数,按变量分组,计算其他列中变量之间的所有可能组合

Luc*_*cas 4 r dataframe

我在R中有一个很大的data.frame,其过度简化的版本看起来像这样(真正的data.frame在"Color"列中有20种颜色,在"Number"列中有10种不同的数字:

Color   Number  Y
blue    1       5
blue    2       3
blue    3       2
red     1       5
red     2       8
red     3       2
green   1       2
green   2       9
green   3       3
Run Code Online (Sandbox Code Playgroud)

对于"颜色"中的每种颜色,我想通过比较"Y"列的相应值,在"数字"列中的所有数字组合之间应用函数.让我们以一个简单的函数为例:

if x >= y, print 1, else print 0 # where x and y represent the first and second values to be compared, respectively 
Run Code Online (Sandbox Code Playgroud)

我会将此作为输出data.frame获取:

Color   Comparison  Y
blue    1_vs_2      1
blue    1_vs_3      1
blue    2_vs_1      0
blue    2_vs_3      1
blue    3_vs_1      0
blue    3_vs_2      0
red     1_vs_2      0
red     1_vs_3      1
red     2_vs_1      1
red     2_vs_3      1
red     3_vs_1      0
red     3_vs_2      0
green   1_vs_2      0
green   1_vs_3      0
green   2_vs_1      1
green   2_vs_3      1
green   3_vs_1      1
green   3_vs_2      0
Run Code Online (Sandbox Code Playgroud)

Mik*_* H. 5

你考虑过SQL吗?您可以将数据合并回自身.如果你限制Color它们是相同的和Number不同的你应该得到你想要的每一对配对比较.这与@ Psidom的回答是相同的概念 - 他只是在data.table加入中做到了.

library(sqldf)
res <- sqldf("SELECT     l.Color, l.Number as l_number, r.Number as r_number,
                          case when l.Y >= r.Y then 1 else 0 end as Y
              FROM       df as l
              INNER JOIN df as r
              ON         l.Color = r.Color AND
                         l.Number != r.Number
             ")

res$comparison <- paste0(res$l_number,"_vs_",res$r_number)

res

   Color l_number r_number Y comparison
1   blue        1        2 1     1_vs_2
2   blue        1        3 1     1_vs_3
3   blue        2        1 0     2_vs_1
4   blue        2        3 1     2_vs_3
5   blue        3        1 0     3_vs_1
6   blue        3        2 0     3_vs_2
7    red        1        2 0     1_vs_2
8    red        1        3 1     1_vs_3
9    red        2        1 1     2_vs_1
10   red        2        3 1     2_vs_3
11   red        3        1 0     3_vs_1
12   red        3        2 0     3_vs_2
13 green        1        2 0     1_vs_2
14 green        1        3 0     1_vs_3
15 green        2        1 1     2_vs_1
16 green        2        3 1     2_vs_3
17 green        3        1 1     3_vs_1
18 green        3        2 0     3_vs_2
Run Code Online (Sandbox Code Playgroud)