持续分类数据序列

时间:2018-02-05 09:57:22

标签: r

我是R的新手,对于向表中添加新变量有疑问。我的数据序列以10开头,以20结尾,出现几次。

有没有办法将这些序列连续分组?

示例:

列中的数据看起来像

10 3 15 15 19 19 20 20 10 10 11 17 20  ...

我希望有这样的输出

10 group 1
3  group 1
15 group 1
15 group 1
19 group 1
19 group 1
20 group 1
20 group 1
10 group 2
10 group 2
11 group 2
17 group 2
20 group 2
...

是否可以编写类似的东西?

非常感谢你的帮助!!

2 个答案:

答案 0 :(得分:2)

使用基数R,您可以检测序列并使用cumsumhead创建分组变量:

df$grp <- cumsum(df$x == 10 & c(20, head(df$x, -1)) == 20)

给出:

> df
     x grp
 1: 10   1
 2:  3   1
 3: 15   1
 4: 15   1
 5: 19   1
 6: 19   1
 7: 20   1
 8: 20   1
 9: 10   2
10: 10   2
11: 11   2
12: 17   2
13: 20   2

这是做什么的:

  • df$x == 10检测到10
  • c(20, head(df$x, -1)) == 20检测前一个值是否等于20,第一个值设置为20,因为df$x的第一个值有先前值
  • 通过将这两者与&结合使用,您会得到一个逻辑值,表明df$中的哪些值等于10且前一个值也等于20
  • cumsum中包含您获得分组值。

data.table

library(data.table)
setDT(df)[, grp := cumsum(x == 10 & c(0, head(x, -1)) == 20)][]

dplyr

library(dplyr)
df %>% 
  mutate(grp = cumsum(x == 10 & lag(x, default = 20) == 20))

您可以使用paste / paste0将文字添加到群组标签中:

paste0('group_', cumsum(df$x == 10 & c(20, head(df$x, -1)) == 20))

使用过的数据:

df <- data.frame(x = c(10, 3, 15, 15, 19, 19, 20, 20, 10, 10, 11, 17, 20))

答案 1 :(得分:0)

试试这个。 x是你的数字,你将成为你的团体。

x<-0:20
y<-NA
df1<-data.frame(x,y)
group1<-(x>10)
group2<-(x<=10)
df1$y[group1]<-"Group1"
df1$y[group2]<-"Group2"
df1