为了账号安全,请及时绑定邮箱和手机立即绑定

为每个数据组中的行创建一个序号(计数器

为每个数据组中的行创建一个序号(计数器

互换的青春 2019-07-08 12:14:21
为每个数据组中的行创建一个序号(计数器我们如何在数据的每一组中生成唯一的标识号?以下是按“PersonId”分组的一些数据:personid date measurement1         x     231         x     322         y     213         x     233         z     233         y     23我希望为“PersonId”定义的每个子集中的每一行添加一个id列,其值总是以1..这是我想要的输出:personid date measurement id1         x     23         11         x     32         22         y     21         13         x     23         13         z     23         23         y     23         3我很感谢你的帮助。
查看完整描述

3 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

被误导的名字ave()函数,带参数FUN=seq_along,就能很好地完成这一任务-即使你personid列没有严格的排序。


df <- read.table(text = "personid date measurement

1         x     23

1         x     32

2         y     21

3         x     23

3         z     23

3         y     23", header=TRUE)


## First with your data.frame

ave(df$personid, df$personid, FUN=seq_along)

# [1] 1 2 1 1 2 3


## Then with another, in which personid is *not* in order

df2 <- df[c(2:6, 1),]

ave(df2$personid, df2$personid, FUN=seq_along)

# [1] 1 1 1 2 3 2


查看完整回答
反对 回复 2019-07-08
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

一些dplyr替代品,使用方便函数row_number和n.


library(dplyr)

df %>% group_by(personid) %>% mutate(id = row_number())

df %>% group_by(personid) %>% mutate(id = 1:n())

df %>% group_by(personid) %>% mutate(id = seq_len(n()))

df %>% group_by(personid) %>% mutate(id = seq_along(personid))

您也可以使用getanID从包装splitstackshape..注意,输入数据集作为data.table.


getanID(data = df, id.vars = "personid")

#    personid date measurement .id

# 1:        1    x          23   1

# 2:        1    x          32   2

# 3:        2    y          21   1

# 4:        3    x          23   1

# 5:        3    z          23   2

# 6:        3    y          23   3


查看完整回答
反对 回复 2019-07-08
?
温温酱

TA贡献1752条经验 获得超4个赞

使用data.table,并假设您希望通过date在personid子集


library(data.table)

DT <- data.table(Data)


DT[,id := order(date), by  = personid]


##    personid date measurement id

## 1:        1    x          23  1

## 2:        1    x          32  2

## 3:        2    y          21  1

## 4:        3    x          23  1

## 5:        3    z          23  3

## 6:        3    y          23  2

如果你不想date


DT[, id := 1:.N, by = personid]


##    personid date measurement id

## 1:        1    x          23  1

## 2:        1    x          32  2

## 3:        2    y          21  1

## 4:        3    x          23  1

## 5:        3    z          23  2

## 6:        3    y          23  3

以下任何一项都将有效


DT[, id := seq_along(measurement), by =  personid]

DT[, id := seq_along(date), by =  personid]

使用的等效命令plyr


library(plyr)

# ordering by date

ddply(Data, .(personid), mutate, id = order(date))

# in original order

ddply(Data, .(personid), mutate, id = seq_along(date))

ddply(Data, .(personid), mutate, id = seq_along(measurement))


查看完整回答
反对 回复 2019-07-08
  • 3 回答
  • 0 关注
  • 647 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信