R中的数据帧分组

时间:2015-12-28 06:14:34

标签: r

我有下面的data.frame。我想添加一个列,根据第1列(inputrate)对我的数据进行分类或分组,使得第一系列inputrate(1到2)470,470在组1中,第二系列(3)450在组中在图2中,(4)470的第三系列在组3中,第四系列(5到7)460,460,460在组4中,依此类推。这样,如最后一栏---

所示
INPUTRATE   TEMP1     TEMP2
 470       355.4972 407.2139
 470       363.2138 414.4102
 450       370.8389 414.6563
 470       381.3884 413.6328
 460       386.9973 401.3242
 460       385.2969 388.0488
 460       390.3884 384.6963

输出

INPUTRATE   TEMP1    TEMP2  group
 470       355.4972 407.2139    1
 470       363.2138 414.4102    1
 450       370.8389 414.6563    2
 470       381.3884 413.6328    3
 460       386.9973 401.3242    4
 460       385.2969 388.0488    4
 460       390.3884 384.6963    4

然后基于没有。在特定组中的元素,我必须创建一个具有最高编号的数据框。相同的输入元素。

3 个答案:

答案 0 :(得分:1)

我们可以尝试

library(data.table)
setDT(df1)[,group:= .GRP ,INPUTRATE]

或使用match

df1$group <- with(df1, match(INPUTRATE, unique(INPUTRATE))) 

更新

如果要在“输入”中进行更改时创建新群组,

setDT(df1)[, group := rleid(INPUTRATE)]

答案 1 :(得分:0)

您可以尝试cumsumduplicated

data.frame(df, group = cumsum(!duplicated(df$INPUTRATE)))

#INPUTRATE   TEMP1    TEMP2  group
# 470      355.4972  407.2139    1
# 470      363.2138  414.4102    1
# 470      370.8389  414.6563    1
# 470      381.3884  413.6328    1
# 460      386.9973  401.3242    2
# 460      385.2969  388.0488    2
# 460      390.3884  384.6963    2

修改

根据更新,如果您希望在INPUTRATE的每次更改时都有新的群组,那么您可以使用rle功能

r <- rle(df$INPUTRATE)
rep(seq_along(r$lengths), r$lengths)

答案 2 :(得分:0)

不确定我理解这个问题。您是否只是尝试使用最多出现的输入水平进行过滤?如果是这样,这是另一个答案。

table(as.factor(df$inputrate))

然后只是基于表的最高值的子集。

df[df$inputrate==highest_value,]