使用R在多级分析中将字符串ID转换为数字

时间:2013-09-17 22:06:39

标签: r

我有两个数据集,一个用于学生级数据,另一个用于班级数据。学生和班级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的位置。

1 个答案:

答案 0 :(得分:2)

假设您的studentIDclassID是因素,我会使用内部这些以数字方式存储的事实。因此,如果你可以在两个因子上得到相同的水平(即以相同的顺序,并且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值等于f2B

关于J的评论我的观点是,如果要匹配表,可以使用merge()执行常用的数据库连接。 E.g:

merge()

如果这是最终目标,那么可以避免可能容易出错的步骤,即按顺序获取等级并转换为整数。