基于唯一ID创建新列,其值为r

时间:2018-05-30 23:27:37

标签: r

对于这些ID中的每一个,我想创建一个名为Age的新列,其中填充了值0 to 5 for each ID(r = 0:5),如下所示。

数据框

ID         
1124
1123

期望的结果

ID   Age
1124  0
1124  1
1124  2
1124  3
1124  4
1124  5
1123  0
1123  1
1123  2
1123  3
1123  4
1123  5

3 个答案:

答案 0 :(得分:2)

这是一个基础R版本:

df = data_frame(ID = c(1124, 1123))
expand.grid(ID = df$ID, Age = 0:5)

##      ID Age
## 1  1124   0
## 2  1123   0
## 3  1124   1
## 4  1123   1
## 5  1124   2
## 6  1123   2
## 7  1124   3
## 8  1123   3
## 9  1124   4
## 10 1123   4
## 11 1124   5
## 12 1123   5

这与tidyr::expand结果的排序方式不同。

修改

正如@thelatemail建议的那样,您可以执行以下操作以避免重命名df

expand.grid(c(Age=list(0:5), df))

merge(df, list(Age=0:5))

编辑2

以下是data.table示例:

library(data.table)
setDT(df) # Convert df to a data.table.
df[, do.call(CJ, list(ID = ID, Age = 0:5))]

对于大型数据集,可能需要对各种方法进行基准测试。

答案 1 :(得分:1)

可以使用tidyr::expand

完成此操作
library(tidyverse)

df = data_frame(ID = c(1124, 1123))

df %>%
    expand(ID, Age = 0:5)

输出:

# A tibble: 12 x 2
      ID   Age
   <dbl> <int>
 1  1123     0
 2  1123     1
 3  1123     2
 4  1123     3
 5  1123     4
 6  1123     5
 7  1124     0
 8  1124     1
 9  1124     2
10  1124     3
11  1124     4
12  1124     5

答案 2 :(得分:0)

library(tidyverse)
your_data_frame %>%
    group_by(ID) %>%
    mutate(Age = (1:n()) - 1)

如果每AgeID个值超过6个,则此功能也适用。