标记堆叠数据集
Labelling a stacked dataset
每年有两组,第一组堆叠在第二组之上。我想添加一个列来表示一行在哪个组中:第一或第二。我为此示例标记了组,但该字段未出现在真实数据集中。
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,得到累加和,paste
和 '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
可以在 dplyr
中使用相同的方法
library(dplyr)
df1 %>%
group_by(year) %>%
mutate(grp = paste("group", cumsum(c(TRUE, diff(measure) < 0))))
每年有两组,第一组堆叠在第二组之上。我想添加一个列来表示一行在哪个组中:第一或第二。我为此示例标记了组,但该字段未出现在真实数据集中。
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,得到累加和,paste
和 '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
可以在 dplyr
library(dplyr)
df1 %>%
group_by(year) %>%
mutate(grp = paste("group", cumsum(c(TRUE, diff(measure) < 0))))