【问题标题】:Sorting Data in R by two columns but alternating each row将 R 中的数据按两列排序,但每行交替
【发布时间】:2018-08-26 21:52:43
【问题描述】:

我试图确定 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... 总数据集是 321 行,这些 ID 和观察频率之间观察到的不同关系)。

但我还需要同时查看有多少次“9”占主导地位,而“5”处于从属地位。是否可以排序使数据看起来像这样?

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

目前它只是基于“主导”列的顺序。有没有办法像我上面展示的那样交替,以便我可以看到 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

【问题讨论】:

  • 数据集更大还是这就是全部?
  • 它更大。 321 行。
  • 现在底部有完整的数据集!

标签: r sorting tidyverse


【解决方案1】:

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

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])

这会生成一个具有 321 个连接的 igraph 对象,您可以通过键入 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 &lt;- 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 &lt;- 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

现在您可以从results 创建一个dplyr-able 数据框(如果您想在另一个数据集上使用它,请务必将 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

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

【讨论】:

  • 谢谢!这很棒!所以我真的不明白 +26/321 或 +13/25 c0101e5(顶点名称)的用途......我有: library(igraph) --- Dominance
  • +26/321... 只是 igraph 对象的元数据。在过去一个小时左右的时间里,我实际上一直在试图找出一种方法来创建一个数据框......当我弄清楚时会告诉你。这已成为让我无法停止思考的难题之一。
  • 你看到我大约一小时前所做的编辑了吗?将数据转换为 df 格式。迂回但有效。
  • 是的!谢谢!为什么是 13?
  • 它只是长度(结果)——我对其进行了硬编码,因此整行将出现在代码窗口中,而无需向右滚动。花式,我知道
【解决方案2】:

dplyr 中的 summarisegroup_by 函数可能在这里有用:

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

【讨论】:

  • 谢谢!我认为这就是我在这里所做的: Dominance1
【解决方案3】:

您是否考虑过将这些数据表示为图表来检查它?如果您只是想确定这些对的位置(如果您想以编程方式执行此操作,则没有那么有用),这可能很有用。您提供的数据没有任何相互关系,因此我们无法在此处选择它们中的任何一个——如果它们确实存在,当您查看图表时它们会弹出。但是,也许这会有所帮助:

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")

如果您想查看图表上的权重,可以将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):

我知道这是解决您问题的一种侧面方法,但希望它可能有点用处!

【讨论】:

  • 谢谢!我确实喜欢这种方法,但是,在我所处的阶段,我只需要看看“X”对“Y”的支配性是否比“Y”对“X”的支配性至少多 3 次,这就是我想要的原因对数据帧进行排序,使其显示“频率”或“5”显性到“9”的出现次数紧挨着“9”显性到“5”,但也许有更好的方法来做到这一点?也许是 if-then 语句?
  • 您能否发布一个包含完整 321 个条目的 URL 或文本文件?我认为使用包含多次出现互斥的示例的数据集,响应可能会更准确。谢谢:)
  • 谢谢@mysteRious!我在上面加了!!
猜你喜欢
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 2021-12-07
  • 2022-11-13
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2014-03-10
相关资源
最近更新 更多