我有两个数据集,一个用于学生级数据,另一个用于班级数据。学生和班级ID生成为字符串值,如:
学生数据集:
学生ID - > 141PSDM2L,1420CHY1L,1JNLV36HH,1MNSBXUST,2K7EVS7X6,2N2SC26HL,...
班级ID - > XK37HDN,XK37HDN,XK37HDN,3K3EH77,3K3EH77,2K36HN6,...
班级数据集:
班级ID - > XK37HDN,3K3EH77,2K36HN6,3K3LHSH,3K3LHSY,DK3EH14,DK3EH1H,DK3EH1K,...
在学生数据集中,每个班级ID的重复次数等于班级中的学生人数,但在班级数据集中,每个班级只有一个代码。
如何将这些ID转换为整数?考虑到学生和班级ID。其他的话,我想要ID如下(或类似的):
学生数据集:
学生ID - > 1,2,3,4,5,6,...
班级ID - > 1,1,1,2,2,3,...
班级数据集:
班级ID - > 1,2,3,4,5,6,7,8,...
修改 学生级数据的转换并不困难。当我想转换类级数据时出现问题。由于学生数据集中重复了类ID,因此类ID从1到1533取值,但在类级数据中执行相同的转换方法会产生1到896之间的值,因此我不知道是否例如类ID为学生级数据中的45个在班级数据集中具有班级ID 45的位置。
答案 0 :(得分:2)
假设您的studentID
和classID
是因素,我会使用内部这些以数字方式存储的事实。因此,如果你可以在两个因子上得到相同的水平(即以相同的顺序,并且identical(levels(f1), levels(f2)) == TRUE
),那么你可以简单地强制转换为整数。
我正在思考以下几点:
## dummy data first
set.seed(1)
df1 <- data.frame(f1 = sample(letters, 100, replace = TRUE),
f2 = sample(LETTERS, 100, replace = TRUE,
prob = rep(c(0.25, 0.75), length = 26)))
df2 <- with(df1, data.frame(f2 = sample(factor(unique(f2),
levels = sample(unique(f2)))),
vals = rnorm(length(unique(f2)))))
请注意,即使数据之间存在匹配(因为我生成它们的方式),因子的级别也不相同
> identical(with(df1, levels(f2)), with(df2, levels(f2)))
[1] FALSE
现在让级别相同,这里我只是采用并集,以防一个因子中存在某些值而不是另一个因子,反之亦然。
## make levels identical
levs <- sort(union(with(df1, levels(f2)), with(df2, levels(f2))))
df1 <- transform(df1, f2 = factor(f2, levels = levs))
df2 <- transform(df2, f2 = factor(f2, levels = levs))
> identical(with(df1, levels(f2)), with(df2, levels(f2)))
[1] TRUE
现在录制到数字
## recode as numeric
df1b <- transform(df1, f2int = as.numeric(f2))
df2b <- transform(df2, f2int = as.numeric(f2))
> head(df1b)
f1 f2 f2int
1 g B 2
2 j D 4
3 o R 17
4 x A 1
5 f F 6
6 x J 10
> head(df2b)
f2 vals f2int
1 Z -0.17955653 23
2 U -0.10019074 20
3 N 0.71266631 13
4 J -0.07356440 10
5 B -0.03763417 2
6 X -0.68166048 22
请注意f1int
的{{1}}和f2int
值等于f2
或B
。
关于J
的评论我的观点是,如果要匹配表,可以使用merge()
执行常用的数据库连接。 E.g:
merge()
如果这是最终目标,那么可以避免可能容易出错的步骤,即按顺序获取等级并转换为整数。