我知道如何在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的分组计数。
任何帮助将不胜感激。
答案 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