我在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)
你考虑过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)
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |