Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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_Calculated Columns - Fatal编程技术网

R 标记堆叠数据集

R 标记堆叠数据集,r,calculated-columns,R,Calculated Columns,每年有两组,第一组堆在第二组的上面。我想添加一列,指示行所在的组:第一组还是第二组。我已经为这个示例标记了组,但该字段不会出现在实际数据集中 year measure data ... 1991 1 ... [group 1] 1991 2 [group 1] 1991 3 [group 1] 1991 1 [group 2] 1991 2 [group 2] 1991

每年有两组,第一组堆在第二组的上面。我想添加一列,指示行所在的组:第一组还是第二组。我已经为这个示例标记了组,但该字段不会出现在实际数据集中

year measure data ...
1991       1  ...  [group 1]
1991       2       [group 1] 
1991       3       [group 1] 
1991       1       [group 2] 
1991       2       [group 2] 
1991       3       [group 2] 
1991       4       [group 2] 
1992       1       [group 1] 
1992       2       [group 1] 
1992       3       [group 1]
1992       1       [group 2] 
1992       2       [group 2] 
1992       3       [group 2] 
1992       4       [group 2] 

我们可以尝试使用
data.table
dplyr
base R
方法。使用
data.table
,我们将'data.frame'转换为'data.table'(
setDT(df1)
),按'year'分组,我们检查'measure'相邻元素的差值是否小于0,获得累计和,然后
使用'group'粘贴
,以创建'grp'列

library(data.table)
setDT(df1)[, grp := paste("group", cumsum(c(TRUE, diff(measure) < 0))), year]
df1   
#    year measure     grp
#1: 1991       1 group 1
#2: 1991       2 group 1
#3: 1991       3 group 1
#4: 1991       1 group 2
#5: 1991       2 group 2
#6: 1991       3 group 2
#7: 1991       4 group 2
#8: 1992       1 group 1
#9: 1992       2 group 1
#10:1992       3 group 1
#11:1992       1 group 2
#12:1992       2 group 2
#13:1992       3 group 2
#14:1992       4 group 2

这个机修工在干什么
cumsum(c(TRUE,
@Hatshepsut
diff
返回的长度比原始长度少一个,因此我们在将diff输出转换为逻辑后与
TRUE
连接,当我们执行cumsum时,TRUE/FALSE强制为二进制,并且对于每个真值,都会添加一个。
library(dplyr)
df1 %>%
  group_by(year) %>%
  mutate(grp = paste("group", cumsum(c(TRUE, diff(measure) < 0))))