首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >维护顺序时基于向量的聚合和折叠

维护顺序时基于向量的聚合和折叠
EN

Stack Overflow用户
提问于 2020-01-30 04:32:02
回答 2查看 64关注 0票数 1

我有一份数据如下:

代码语言:javascript
复制
+------+-----+----------+
| from | to  | priority |
+------+-----+----------+
|    1 |   8 |        1 |
|    2 |   6 |        1 |
|    3 |   4 |        1 |
|    4 |   5 |        3 |
|    5 |   6 |        4 |
|    6 |   2 |        5 |
|    7 |   8 |        2 |
|    4 |   3 |        5 |
|    2 |   1 |        1 |
|    6 |   6 |        4 |
|    1 |   7 |        5 |
|    8 |   4 |        6 |
|    9 |   5 |        3 |
+------+-----+----------+

我的目标是根据from列对" to“列进行分组,但是如果变量已经出现在这两个列中,我也不想进一步考虑它们,总优先级将是所有组优先级的总和。

因此,产生的数据将如下所示:

代码语言:javascript
复制
+------+------+----------------+
| from |  to  | Total Priority |
+------+------+----------------+
|    1 | 8, 7 |              6 |
|    2 |    6 |              1 |
|    3 |    4 |              1 |
|    9 |    5 |              3 |
+------+------+----------------+

此外,我希望在分组时保持与原始表相同的顺序。

我能够使用下面的"splitstackshape“包折叠from列

代码语言:javascript
复制
library(splitstackshape)
cSplit(df, 'to', sep = ','
+        , direction = 'long')[, .(to = toString(unique(to)))
+                              , by = from]

这确实引入了dupicate值,我想知道是否有一种方法可以使用任何其他包来获得所需的结果

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-30 05:50:39

使用“注释”末尾可重复显示的DF,通过fromDF2进行排序,然后遍历其行,删除带有重复的任何行。我们需要一个循环在这里,因为每次删除取决于先前的。最后对结果进行总结。

代码语言:javascript
复制
library(dplyr)

DF2 <- arrange(DF, from)

i <- 1
while(i <= nrow(DF2)) {
  ix <- seq_len(i-1)
  dup <- with(DF2, (to[i] %in% c(to[ix], from[ix])) | (from[i] %in% to[ix]))
  if (dup) DF2 <- DF2[-i, ] else i <- i + 1
}

DF2 %>%
  group_by(from) %>%
  summarize(to = toString(to), priority = sum(priority)) %>%
  ungroup

给予:

代码语言:javascript
复制
# A tibble: 4 x 3
   from to    priority
  <int> <chr>    <int>
1     1 8, 7         6
2     2 6            1
3     3 4            1
4     9 5            3

备注

代码语言:javascript
复制
Lines <- "from | to  | priority
   1 |   8 |        1
   2 |   6 |        1
   3 |   4 |        1
   4 |   5 |        3
   5 |   6 |        4
   6 |   2 |        5
   7 |   8 |        2
   4 |   3 |        5
   2 |   1 |        1
   6 |   6 |        4
   1 |   7 |        5
   8 |   4 |        6
   9 |   5 |        3"
DF <- read.table(text = Lines, header = TRUE, sep = "|", strip.white = TRUE)
票数 1
EN

Stack Overflow用户

发布于 2020-01-30 04:51:18

目前还不清楚你是如何创建团队的,但这至少会让你得到正确的答案:

代码语言:javascript
复制
library(tidyverse)

df <- tribble(~from, ~to, ~priority,
              1,8,1,
              2,6,1,
              3,4,1,
              4,5,3,
              5,6,4,
              6,2,5,
              7,8,2,
              4,3,5,
              2,1,1,
              6,6,4,
              1,7,5,
              8,4,6,
              9,5,3)

df %>%
  group_by(from) %>%
  summarise(to = toString(to),
            `Total Priority` = sum(priority, na.rm=T))

你的结果是:

代码语言:javascript
复制
# A tibble: 9 x 3
   from to    `Total Priority`
  <dbl> <chr>            <dbl>
1     1 8, 7                 6
2     2 6, 1                 2
3     3 4                    1
4     4 5, 3                 8
5     5 6                    4
6     6 2, 6                 9
7     7 8                    2
8     8 4                    6
9     9 5                    3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59979111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档