基于具有r中值的唯一ID创建新列
对于这些ID中的每一个,我想创建一个名为Age的新列,为每个ID填充值基于具有r中值的唯一ID创建新列,r,R,对于这些ID中的每一个,我想创建一个名为Age的新列,为每个ID填充值0到5(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 如果每个ID的Age值超过6,则此功能也有效 如果每个ID的Age值超过6个,则此功能也可以使用tidyr::expand
0到5(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
如果每个ID
的Age
值超过6,则此功能也有效
如果每个ID
的Age
值超过6个,则此功能也可以使用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
#一个tible:12 x 2
身份证年龄
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
这可以通过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
#一个tible:12 x 2
身份证年龄
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
这是一个基本的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))
或
编辑2
下面是一个数据表
示例:
library(data.table)
setDT(df) # Convert df to a data.table.
df[, do.call(CJ, list(ID = ID, Age = 0:5))]
对于大型数据集,可能需要对各种方法进行基准测试。以下是基本的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))
或
编辑2
下面是一个数据表
示例:
library(data.table)
setDT(df) # Convert df to a data.table.
df[, do.call(CJ, list(ID = ID, Age = 0:5))]
对于大型数据集,可能需要对各种方法进行基准测试。我对这个问题的理解是,目前数据帧中每个ID只有一行,我认为这个答案在这种情况下不起作用。我明白了。在这种情况下,我误解了@marius。我对这个问题的理解是,目前数据帧中每个ID只有一行,我认为这个答案在这种情况下不起作用。我明白了。在那种情况下,我误解了@marius,没有重命名df
-expand.grid(c(Age=list(0:5),df))
或者笛卡尔式的join-it-merge(df,list(Age=0:5))
@latemail很棒的建议!无需重命名df
-expand.grid(c(Age=list(0:5),df))
或笛卡尔加入它-merge(df,list(Age=0:5))
@thelatemail伟大的建议!