从另一个条件创建新变量(循环??)

时间:2021-05-16 00:20:35

标签: r

我有一个看起来像这样的数据框(尽管天数和 uid 有更多的观察):

   day   uid
1    1 0zOs6
2    2 0zOs6
3    3 0zOs6
4    4 0zOs6
5    1 3jtMi
6    2 3jtMi
7    3 3jtMi
8    1 5mJSn
9    2 5mJSn
10   3 5mJSn
11   1 dD8ro
12   2 dD8ro

我想创建一个基于 uid 的新变量——基本上是一个新的 id,它从 1 开始,每次我们在 uid 行中有一个新 id 时增加 1,就像这样:

   day   uid newid
1    1 0zOs6     1
2    2 0zOs6     1
3    3 0zOs6     1
4    4 0zOs6     1
5    1 3jtMi     2
6    2 3jtMi     2
7    3 3jtMi     2
8    1 5mJSn     3
9    2 5mJSn     3
10   3 5mJSn     3
11   1 dD8ro     4
12   2 dD8ro     4

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

base R 中,我们可以使用 match,它会非常快速和高效。不需要循环

df1$newid <- with(df1, match(uid, unique(uid)))

或者使用factor并强制integer

df1$newid <- with(df1, as.integer(factor(uid, levels = unique(uid))))

答案 1 :(得分:2)

使用 data.table.GRP 选项

> setDT(df)[, newid := .GRP, uid][]
    day   uid newid
 1:   1 0zOs6     1
 2:   2 0zOs6     1
 3:   3 0zOs6     1
 4:   4 0zOs6     1
 5:   1 3jtMi     2
 6:   2 3jtMi     2
 7:   3 3jtMi     2
 8:   1 5mJSn     3
 9:   2 5mJSn     3
10:   3 5mJSn     3
11:   1 dD8ro     4
12:   2 dD8ro     4

rleid

> setDT(df)[, newid := rleid(uid)][]
    day   uid newid
 1:   1 0zOs6     1
 2:   2 0zOs6     1
 3:   3 0zOs6     1
 4:   4 0zOs6     1
 5:   1 3jtMi     2
 6:   2 3jtMi     2
 7:   3 3jtMi     2
 8:   1 5mJSn     3
 9:   2 5mJSn     3
10:   3 5mJSn     3
11:   1 dD8ro     4
12:   2 dD8ro     4
相关问题