我是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
...
是否可以编写类似的东西?
非常感谢你的帮助!!
答案 0 :(得分:2)
使用基数R,您可以检测序列并使用cumsum
和head
创建分组变量:
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