对于这些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
答案 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)
如果每Age
个ID
个值超过6个,则此功能也适用。