1

我有两个数据集,一个用于学生级别的数据,另一个用于班级级别的数据。学生和班级 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.IN 换句话说,我希望拥有如下 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 的位置。

4

1 回答 1

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

注意等于或的f1intf2int值。f2BJ

我在评论中的观点merge()是,如果你想匹配表,你可以使用merge(). 例如:

> head(merge(df1, df2, sort = FALSE))
  f2 f1        vals
1  B  g -0.03763417
2  B  v -0.03763417
3  B  u -0.03763417
4  B  e -0.03763417
5  B  w -0.03763417
6  D  i -0.58889449

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

于 2013-09-18T02:39:48.590 回答