在一个组内创建R ID

13 浏览
0 Comments

在一个组内创建R ID

我有以下数据集:

df<-structure(list(IDFAM = c("2010 7599 2996 1", "2010 7599 3071 1", 
"2010 7599 3071 1", "2010 7599 3660 1", "2010 7599 4736 1", "2010 7599 6235 1", 
"2010 7599 6299 1", "2010 7599 9903 1", "2010 7599 11013 1", 
"2010 7599 11778 1", "2010 7599 11778 1", "2010 7599 12248 1", 
"2010 7599 13127 1", "2010 7599 14261 1", "2010 7599 16280 1", 
"2010 7599 16280 1", "2010 7599 16280 1", "2010 7599 16280 1", 
"2010 7599 16280 1", "2010 7599 17382 1"), AGED = c(45L, 47L, 
24L, 46L, 46L, 44L, 43L, 43L, 43L, 16L, 43L, 46L, 44L, 47L, 43L, 
16L, 20L, 18L, 18L, 43L)), .Names = c("IDFAM", "AGED"), row.names = c("5614", 
"5748", "5753", "6864", "8894", "11761", "11884", "18738", "20896", 
"22351", "22353", "23267", "24939", "27072", "30946", "30947", 
"30949", "30950", "30952", "33034"), class = "data.frame")

我想为每个具有相同IDFAM值的观察分配一个ID,范围从1到n,其中n是具有相同IDFAM值的观察数量。这将导致以下表格:

IDFAM              AGED     ID
2010 7599 2996 1    45       1
2010 7599 3071 1    47       1
2010 7599 3071 1    24       2
2010 7599 3660 1    46       1
2010 7599 4736 1    46       1
2010 7599 6235 1    44       1
2010 7599 6299 1    43       1
2010 7599 9903 1    43       1
2010 7599 11013 1   43       1
2010 7599 11778 1   16       1
2010 7599 11778 1   43       2
2010 7599 12248 1   46       1
2010 7599 13127 1   44       1
2010 7599 14261 1   47       1
2010 7599 16280 1   43       1
2010 7599 16280 1   16       2
2010 7599 16280 1   20       3
2010 7599 16280 1   18       4
2010 7599 16280 1   18       5
2010 7599 17382 1   43       1

我应该如何实现这个?谢谢。

0
0 Comments

问题原因:在dplyr 0.5版本中,虽然可以使用group_indices函数来为每个组创建一个唯一的ID,但是它不支持mutate函数。

解决方法:可以使用下面的方法来解决这个问题:

df$id <- df %>% group_indices(IDFAM)

这行代码将为每个组创建一个唯一的ID,并将结果保存在df数据框的id列中。

0
0 Comments

问题的原因是在一个组内为每个观察值创建一个唯一的标识符(ID)。解决方法是使用不同的R包和函数来实现。

首先,可以使用基本的R函数ave来创建ID:

with(df, ave(rep(1, nrow(df)), IDFAM, FUN = seq_along))
#  [1] 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 2 3 4 5 1

其次,可以使用"data.table"包中的sequence(.N)函数来实现:

library(data.table)
DT <- as.data.table(df)
DT[, ID := sequence(.N), by = IDFAM]

还可以使用"dplyr"包中的mutate函数来实现:

df %>% group_by(IDFAM) %>% mutate(count = sequence(n()))

或者使用row_number函数:

df %>% group_by(IDFAM) %>% mutate(count = row_number(IDFAM))

此外,还可以使用"splitstackshape"包中的getanID函数来实现:

library(splitstackshape)
getanID(df, id.vars = "IDFAM")
#                 IDFAM AGED .id
#  1:  2010 7599 2996 1   45   1
#  2:  2010 7599 3071 1   47   1
#  3:  2010 7599 3071 1   24   2
#  4:  2010 7599 3660 1   46   1
#  5:  2010 7599 4736 1   46   1
#  6:  2010 7599 6235 1   44   1
#  7:  2010 7599 6299 1   43   1
#  8:  2010 7599 9903 1   43   1
#  9: 2010 7599 11013 1   43   1
# 10: 2010 7599 11778 1   16   1
# 11: 2010 7599 11778 1   43   2
# 12: 2010 7599 12248 1   46   1
# 13: 2010 7599 13127 1   44   1
# 14: 2010 7599 14261 1   47   1
# 15: 2010 7599 16280 1   43   1
# 16: 2010 7599 16280 1   16   2
# 17: 2010 7599 16280 1   20   3
# 18: 2010 7599 16280 1   18   4
# 19: 2010 7599 16280 1   18   5
# 20: 2010 7599 17382 1   43   1

以上是在R中创建组内ID的几种方法。每种方法都有不同的优缺点,可以根据具体需求选择合适的方法。

0