Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何按组编号?_R_Dataframe_Group By - Fatal编程技术网

R 如何按组编号?

R 如何按组编号?,r,dataframe,group-by,R,Dataframe,Group By,我想添加seq列作为分组编号,分组由BSTN、ASTN、O和D组织。 这项工作对我来说很难归类为小组中的另一个小组。 只要BSTN和O相等,ASTN和D相等,就会创建一个组 BSTN ASTN O D 150 202 150 151 150 202 151 201 150 202 201 202 150 202 150 426 150 202 426 423 150 202 423 321 150 202 321 320 150 202 320 203 150 202 203 202 150 4

我想添加seq列作为分组编号,分组由BSTN、ASTN、O和D组织。 这项工作对我来说很难归类为小组中的另一个小组。 只要BSTN和O相等,ASTN和D相等,就会创建一个组

BSTN ASTN O D
150 202 150 151
150 202 151 201
150 202 201 202
150 202 150 426
150 202 426 423
150 202 423 321
150 202 321 320
150 202 320 203
150 202 203 202
150 403 150 426
150 403 426 423
150 403 423 321
150 403 321 320
150 403 320 403
150 403 150 151
150 403 151 201
150 403 201 403
150 403 150 426
150 403 426 422
150 403 422 205
150 403 205 403
在BSTN 150到ASTN 202的情况下,它有两个组,因为O和D中分别有两个150和202。 seq列我想要的是这样的

BSTN ASTN O D seq
150 202 150 151 1
150 202 151 201 1
150 202 201 202 1
150 202 150 426 2
150 202 426 423 2
150 202 423 321 2
150 202 321 320 2
150 202 320 203 2
150 202 203 202 2
150 403 150 426 1
150 403 426 423 1
150 403 423 321 1
150 403 321 320 1
150 403 320 403 1
150 403 150 151 2
150 403 151 201 2
150 403 201 403 2
150 403 150 426 3
150 403 426 422 3
150 403 422 205 3
150 403 205 403 3
请帮帮我

这里有一个dplyr解决方案:

library(dplyr)
df %>% group_by(BSTN, ASTN) %>%
    mutate(g = lag(D) != O,
           g = if_else(is.na(g), FALSE, g),
           seq = cumsum(g) + 1)
# A tibble: 21 x 6
# Groups:   BSTN, ASTN [2]
    BSTN  ASTN     O     D g       seq
   <int> <int> <int> <int> <lgl> <dbl>
 1   150   202   150   151 FALSE     1
 2   150   202   151   201 FALSE     1
 3   150   202   201   202 FALSE     1
 4   150   202   150   426 TRUE      2
 5   150   202   426   423 FALSE     2
 6   150   202   423   321 FALSE     2
 7   150   202   321   320 FALSE     2
 8   150   202   320   203 FALSE     2
 9   150   202   203   202 FALSE     2
10   150   403   150   426 FALSE     1
# ... with 11 more rows
以下是dplyr解决方案:

library(dplyr)
df %>% group_by(BSTN, ASTN) %>%
    mutate(g = lag(D) != O,
           g = if_else(is.na(g), FALSE, g),
           seq = cumsum(g) + 1)
# A tibble: 21 x 6
# Groups:   BSTN, ASTN [2]
    BSTN  ASTN     O     D g       seq
   <int> <int> <int> <int> <lgl> <dbl>
 1   150   202   150   151 FALSE     1
 2   150   202   151   201 FALSE     1
 3   150   202   201   202 FALSE     1
 4   150   202   150   426 TRUE      2
 5   150   202   426   423 FALSE     2
 6   150   202   423   321 FALSE     2
 7   150   202   321   320 FALSE     2
 8   150   202   320   203 FALSE     2
 9   150   202   203   202 FALSE     2
10   150   403   150   426 FALSE     1
# ... with 11 more rows

我试着用另一种方法和tapply一起组建团队

attach(df)

tapply(O, list(BSTN, ASTN), function(x) cumsum(x == x[1]) ) %>% unlist

  [1] 1 1 1 2 2 2 2 2 2 1 1 1 1 1 2 2 2 3 3 3 3 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 1
 [38] 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 2 2 2 2 1 1 1 1 2 2 2
 [75] 2 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 4 4 4 4 1 1 1 1

它得到与第一个答案相同的输出。希望能对您有所帮助。

我尝试用tapply的另一种方式进行分组

attach(df)

tapply(O, list(BSTN, ASTN), function(x) cumsum(x == x[1]) ) %>% unlist

  [1] 1 1 1 2 2 2 2 2 2 1 1 1 1 1 2 2 2 3 3 3 3 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 1
 [38] 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 2 2 2 2 1 1 1 1 2 2 2
 [75] 2 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 4 4 4 4 1 1 1 1

它得到与第一个答案相同的输出。希望对您有所帮助。

您能再解释一下吗?您的预期输出与您的目标不一致description@SotosBSTN和ASTN指的是起点和终点。O和D是路径上的链接。BSTN和ASTN可以有多条路由,seq表示路由的编号。你能理解一点吗??!很难解释!!!嗯,我现在知道了。。。。您需要的是查看一个名为igraph@Sotos你能帮我解决这个问题吗??!!我真的希望能解决这个问题。我对它的解释是,对于BSTN和ASTN的每一个组合,每次O等于BSTN时,都会创建一个新的组。对吗?您是否可以通过发布dputdf的输出来共享您的数据,其中df是您的数据,或者dputheaddf,100,如果太长的话?您可以解释一下吗?您的预期输出与您的目标不一致description@SotosBSTN和ASTN指的是起点和终点。O和D是路径上的链接。BSTN和ASTN可以有多条路由,seq表示路由的编号。你能理解一点吗??!很难解释!!!嗯,我现在知道了。。。。您需要的是查看一个名为igraph@Sotos你能帮我解决这个问题吗??!!我真的希望能解决这个问题。我对它的解释是,对于BSTN和ASTN的每一个组合,每次O等于BSTN时,都会创建一个新的组。对吗?您可以通过发布dputdf的输出来共享您的数据,其中df是您的数据,或者如果太长,可以发布dputheaddf,100?或者:df%>%groupbybstn,ASTN%>%mutateseq=cumsumlagD,default=TRUE!=O?@Jaap我认为default=TRUE本质上会被强制为default=1,因为D是数字,所以如果O取值1,这将中断。或者:df%>%groupbybstn,ASTN%>%mutateseq=cumsumlagD,default=TRUE!=O?@Jaap我认为default=TRUE本质上会强制为default=1,因为D是数字,所以如果O取值1,则会中断。我建议使用with而不是attach-attaching可能会导致很多问题。我建议使用with而不是attaching-attaching可能会导致很多问题。