R中的数据按两列排序,但每行交替排列

时间:2018-03-18 03:48:29

标签: r sorting tidyverse

我试图确定x或y个体(由每个唯一数字表示)彼此占优势的次数。我用count来概括数据:

Dominance1<-count(Dominance, c('Dominant', 'Subordinate')) 

数据看起来像这样:

 >     Dominant Subordinate freq
            5           9   14
            5          10    9
            5          11    4
            5          15    7
            5          18   14
            5          22    6
            5          24    9
            5          26    5
            5          40    8
            5          43    5
            9          10    4
            9          11    6
            9          15    1
            9          18    7
            9          22   14
            9          24    6
            9          25    7
           10          15    1
           10          18    1
           10          22    2
           10          40    1
           10          43    1
           10          75    4

......依此类推(所有独特的ID都是:5,9,10,11,80,15,75,18,85,22,82,24,25,26,86,68,79 ,83,81,77,91,40,87,43,78 ...总数据集是在这些ID和观察频率之间观察到的321行不同关系。)

但我还需要看看'5'在从属的情况下是'5'是多少次占主导地位。是否可以订购,以便数据看起来像这样?

 >     Dominant Subordinate freq
          5          9       14
          9          5        0
          5          11       4
          11         5        7

目前它只是基于'Dominant'列的顺序。有没有一种方法可以像我上面所说的那样交替,这样我就可以看到x对y有多大的优势,并且比较y对x排列的频率是多少?

以下是完整的数据集:

Dom Sub freq
5   9   14
5   10  9
5   11  4
5   15  7
5   18  14
5   22  6
5   24  9
5   26  5
5   40  8
5   43  5
5   75  15
5   77  10
5   78  10
5   80  3
5   81  2
5   82  12
5   83  11
5   85  8
5   87  11
5   91  16
9   10  4
9   11  6
9   15  1
9   18  7
9   22  14
9   24  6
9   25  7
9   26  6
9   40  12
9   43  8
9   75  10
9   77  1
9   79  1
9   80  4
9   82  20
9   85  9
9   87  7
9   91  4
10  15  1
10  18  1
10  22  2
10  40  1
10  43  1
10  75  4
10  78  1
10  79  4
10  80  3
10  81  1
10  87  1
11  10  2
11  26  1
11  40  1
11  43  3
11  77  1
11  80  5
11  85  1
15  18  2
15  22  1
15  43  1
15  77  1
15  78  1
15  79  2
15  81  1
15  83  2
15  85  2
15  87  2
15  91  2
18  22  2
18  24  1
18  78  2
18  79  1
18  80  4
22  24  2
22  40  1
24  10  1
24  18  1
24  22  7
24  26  11
24  75  1
24  78  3
24  79  8
24  81  11
24  83  5
24  86  8
24  91  13
25  5   3
25  9   1
25  10  3
25  11  3
25  15  2
25  18  1
25  22  6
25  24  5
25  26  3
25  40  5
25  43  8
25  75  3
25  77  7
25  78  5
25  79  5
25  80  3
25  81  2
25  82  6
25  83  5
25  85  2
25  87  6
25  91  3
26  10  3
26  11  8
26  18  5
26  22  1
26  40  9
26  43  5
26  77  1
26  78  7
26  80  5
26  83  1
26  85  3
26  91  1
40  10  1
40  15  1
40  22  4
40  25  1
40  75  1
40  80  1
40  81  1
40  83  1
40  85  1
40  87  2
40  91  1
43  18  2
43  22  2
43  24  7
43  40  4
43  75  3
43  77  2
43  79  2
43  80  3
43  82  1
68  5   15
68  9   41
68  10  3
68  11  5
68  15  6
68  18  9
68  22  12
68  24  8
68  25  14
68  26  1
68  40  8
68  43  10
68  75  6
68  77  9
68  78  3
68  79  6
68  80  3
68  81  3
68  82  5
68  83  5
68  85  12
68  86  9
68  87  9
68  91  4
75  10  1
75  15  1
75  18  2
75  22  4
75  24  2
75  26  2
75  40  3
75  77  1
75  78  6
75  79  6
75  80  6
75  81  1
75  82  2
75  87  7
77  5   1
77  15  1
77  18  7
77  22  2
77  24  1
77  40  4
77  78  8
77  79  2
77  80  4
77  81  7
77  82  1
77  85  5
77  87  3
78  10  3
78  11  1
78  15  1
78  18  1
78  40  2
78  43  1
78  83  2
78  86  2
79  5   4
79  9   20
79  15  1
79  18  1
79  26  4
79  68  1
79  75  1
79  77  1
79  78  2
79  80  1
79  81  4
79  82  10
79  83  9
79  85  4
79  91  15
80  22  2
80  43  1
80  78  2
81  5   14
81  9   20
81  10  2
81  18  8
81  22  11
81  25  3
81  26  4
81  43  1
81  68  1
81  75  4
81  77  1
81  78  4
81  79  3
81  80  11
81  82  13
81  83  13
81  85  1
81  86  3
81  87  1
81  91  16
82  10  4
82  15  4
82  18  1
82  22  1
82  24  3
82  26  2
82  40  7
82  43  3
82  77  5
82  78  2
82  80  4
82  83  3
82  85  2
82  87  4
83  9   2
83  10  4
83  11  3
83  15  7
83  18  2
83  22  2
83  25  2
83  26  5
83  43  3
83  68  1
83  75  3
83  77  7
83  78  5
83  80  2
83  81  1
83  82  2
83  85  1
83  87  9
83  91  4
85  10  2
85  11  2
85  15  1
85  18  1
85  22  2
85  26  1
85  40  2
85  43  6
85  75  4
85  78  1
85  79  2
85  80  2
86  5   9
86  9   6
86  10  5
86  11  6
86  15  5
86  18  5
86  22  9
86  25  22
86  26  6
86  40  3
86  43  12
86  68  1
86  75  16
86  77  4
86  78  4
86  79  9
86  80  8
86  82  16
86  83  6
86  85  6
86  87  5
86  91  12
87  10  1
87  77  1
87  80  4
87  85  1
91  10  4
91  11  3
91  18  5
91  22  1
91  24  1
91  26  2
91  40  1
91  43  1
91  75  3
91  77  4
91  80  2
91  82  9
91  85  8
91  87  8

3 个答案:

答案 0 :(得分:0)

summarise中的group_bydplyr函数可能在此处有用:

library(dplyr)

# Creating some data for us to work with: 
x <- round(runif(n = 100, min = 0, max = 10))
y <- round(runif(n = 100, min = 0, max = 10))

df <- data.frame(x,y)

df %>% 
  group_by(x, y) %>%
  summarise(freq= n())

每个唯一的x和y对的频率在'freq'列中生成

# A tibble: 65 x 3
# Groups:   x [?]
       x     y   freq
   <dbl> <dbl>  <int>
 1    0.    0.      1
 2    0.    2.      1
 3    0.    4.      1
 4    0.    5.      1
 5    0.    7.      1
 6    1.    2.      3
 7    1.    4.      2
 8    1.    5.      2
 9    1.    6.      2
10    1.    8.      1
# ... with 55 more rows

答案 1 :(得分:0)

您是否考虑将此数据表示为图表以进行检查?如果您只是想确定对的位置(如果您想以编程方式执行此操作,那么它就没有用)可能会很有用。您提供的数据没有任何相互作用,因此我们无法在此处选择任何数据 - 如果它们确实存在,则在您查看图表时它们会显示为POP。但是,这可能会有所帮助:

library(igraph)
Dominance1 <- read.table("local copy of data",header=TRUE)
g <- graph.data.frame(Dominance1[,1:2],directed=TRUE)
E(g)$weight <- as.numeric(Dominance1[,3])
plot(g,edge.arrow.size=0.5,edge.curved=0.2,vertex.color="lightblue",
   vertex.size=22,layout=layout_on_grid,edge.color="black")

Pair Identification

如果您想在图表上查看权重,可以将edge.label=E(g)$weight作为参数添加到plot

你可以找到带有which(which_mutual(g)=="TRUE")倒数的节点 - 由于样本数据中没有匹配项,输出很无聊,但是当你在完整数据集上运行它时,它应该拉出你所有的共同点你。

> E(g)[which(which_mutual(g)=="FALSE")]  # edges where there are no mutuals
+ 23/23 edges from 998a30d (vertex names):
 [1] 5 ->9  5 ->10 5 ->11 5 ->15 5 ->18 5 ->22 5 ->24 5 ->26 5 ->40 5 ->43 9 ->10 9 ->11
[13] 9 ->15 9 ->18 9 ->22 9 ->24 9 ->25 10->15 10->18 10->22 10->40 10->43 10->75

> E(g)[which(which_mutual(g)=="TRUE")]  # edges where there ARE mutuals
+ 0/23 edges from 998a30d (vertex names):

我知道这对你的问题是一种横向的方法,但希望它可能有点用处!

答案 2 :(得分:0)

感谢您发布完整的数据集!更新如下:

library(igraph)
Dom <- read.table("localcopyofdata.txt",header=TRUE)
g <- graph.data.frame(Dom[,1:2],directed=TRUE)
E(g)$weight <- as.numeric(Dom[,3])

这将生成一个igraph对象,其中包含321个连接,您可以通过键入g来查看这些连接。要进行所需的排序,我们必须拉出前半部分+ 1的顶点:

> vertices <- unique(V(g)[1:floor((length(unique(V(g)))/2)+1)])
+ 13/25 vertices, named, from c0101e5:
 [1] 5  9  10 11 15 18 22 24 25 26 40 43 68

(实际上,如果对vertices <- unique(V(g)的所有顶点执行此操作不会有任何影响 - 您以后可以通过任何节点查找连接。)现在我们知道了顶点,我们可以将函数应用于所有将以比较它们的方式拉出匹配的函数。命令是:

lapply(vertices, function(x) E(g)[[inc(x)]])

输出如下所示,每个节点有一个组:

$`5`
+ 26/321 edges from c0101e5 (vertex names):
    tail head tid hid weight
1      5    9   1   2     14
2      5   10   1   3      9
3      5   11   1   4      4
4      5   15   1   5      7
5      5   18   1   6     14
6      5   22   1   7      6
7      5   24   1   8      9
8      5   26   1  10      5
9      5   40   1  11      8
10     5   43   1  12      5
11     5   75   1  14     15
12     5   77   1  15     10
13     5   78   1  16     10
14     5   80   1  18      3
15     5   81   1  19      2
16     5   82   1  20     12
17     5   83   1  21     11
18     5   85   1  22      8
19     5   87   1  24     11
20     5   91   1  25     16
86    25    5   9   1      3
140   68    5  13   1     15
178   77    5  15   1      1
199   79    5  17   1      4
217   81    5  19   1     14
282   86    5  23   1      9

如果你results <- lapply(vertices, function(x) E(g)[[inc(x)]]),那么你可以单独调用你想要的任何节点:

> results$'5'
+ 26/321 edges from c0101e5 (vertex names):
    tail head tid hid weight
1      5    9   1   2     14
2      5   10   1   3      9
3      5   11   1   4      4
... the rest are truncated

现在,您可以从dplyr创建一个results数据框(如果要在其他数据集上使用此功能,请务必将13更改为length(results)):

step1 <- capture.output(for(n in 1:13) { for(j in n){print(results[[j]])} })
step2 <- step1[grep("^\\d",step1),drop=T]
step3 <- unlist(strsplit(step2,"\\s+")) # produces list of 1938 numbers
step4 <- as.data.frame(matrix(unlist(step3), ncol=6, byrow=TRUE), stringsAsFactors=FALSE)
group <- cumsum(c(1, sign(diff(as.numeric(step4$V1)) < 0)))
step5 <- cbind(group,step4[,c(2,3,6)])
names(step5) <- c("Group","Dom","Sub","Weight")

现在你可以用它来做dplyr之类的事情:

> step5 %>% filter(Group==1)
   Group Dom Sub Weight
1      1   5   9     14
2      1   5  10      9
3      1   5  11      4
4      1   5  15      7
5      1   5  18     14
6      1   5  22      6
... the rest is truncated

希望这有帮助!必须有一个更简单的方法来解决这个问题,但是我喜欢将它表示为图表,让您有机会可视化连接(可能不是针对您的问题,而是针对我遇到的其他问题)。