假设您的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
和f2int
值。f2
B
J
我在评论中的观点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
如果这是最终目标,这将避免可能容易出错的步骤,即按顺序获取级别并转换为整数。