在数据R中分配子组

时间:2019-09-01 04:46:42

标签: r dataframe group-by dplyr data-manipulation

我知道如何在R中做基本的事情,但是我还是个新手。我可能还会问一个非常多余的问题(但我不知道如何将其输入到Google中,以便找到正确的匹配项。)

我的热门歌曲如下:

Assign value to group based on condition in column

R - Group by variable and then assign a unique ID

我想将子组划分为组,并根据它们创建一个新列。 我有如下数据:

数据框:

ID    SubID    Values
1     15       0.5
1     15       0.2
2     13       0.1
2     13       0
1     14       0.3
1     14       0.3
2     10       0.2
2     10       1.6
6     31       0.7
6     31       1.0

新数据框:

ID    SubID    Values   groups
1     15       0.5      2
1     15       0.2      2
2     13       0.1      2
2     13       0        2
1     14       0.3      1
1     14       0.3      1
2     10       0.2      1
2     10       1.6      1
6     31       0.7      1
6     31       1.0      1

我已经在R中尝试了以下方法,但没有得到预期的结果:

newdataframe$groups <- dataframe %>% group_indices(,dataframe$ID, dataframe$SubID)
newdataframe<- dataframe %>% group_by(ID, SubID) %>% mutate(groups=group_indices(,dataframe$ID, dataframe$SubID))

我不确定如何在R中构建问题。我想按ID和SubID分组,然后分配按ID分组的那些子组,并重置每个ID的分组计数。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

这是使用rleid()包中的data.table函数的另一种方法。 rleid()生成一个游程类型id列。

根据预期结果,OP希望SubId按值顺序编号,而不是按出现顺序编号。因此,我们需要调用arrange()

library(dplyr)
df %>% 
  group_by(ID) %>% 
  arrange(SubID) %>% 
  mutate(groups = data.table::rleid(SubID))
      ID SubID Values groups
   <int> <int>  <dbl>  <int>
 1     2    10    0.2      1
 2     2    10    1.6      1
 3     2    13    0.1      2
 4     2    13    0        2
 5     1    14    0.3      1
 6     1    14    0.3      1
 7     1    15    0.5      2
 8     1    15    0.2      2
 9     6    31    0.7      1
10     6    31    1        1

请注意,行顺序已更改。

顺便说一句:使用data.table,代码不再那么冗长,并且保留了原始的行顺序:

library(data.table)
setDT(df)[order(ID, SubID), groups := rleid(SubID), by = ID][]
    ID SubID Values groups
 1:  1    15    0.5      2
 2:  1    15    0.2      2
 3:  2    13    0.1      2
 4:  2    13    0.0      2
 5:  1    14    0.3      1
 6:  1    14    0.3      1
 7:  2    10    0.2      1
 8:  2    10    1.6      1
 9:  6    31    0.7      1
10:  6    31    1.0      1

答案 1 :(得分:2)

有多种方法可以做到这一点:mycommand group_by并通过将其转换为ID然后转换为整数为每个SubID创建一个唯一的数字

factor

在基数R中,我们可以使用具有类似逻辑的library(dplyr) df %>% group_by(ID) %>% mutate(groups = as.integer(factor(SubID))) # ID SubID Values groups # <int> <int> <dbl> <int> # 1 1 15 0.5 2 # 2 1 15 0.2 2 # 3 2 13 0.1 2 # 4 2 13 0 2 # 5 1 14 0.3 1 # 6 1 14 0.3 1 # 7 2 10 0.2 1 # 8 2 10 1.6 1 # 9 6 31 0.7 1 #10 6 31 1 1

ave