R 两列的连接因子级别

R 两列的连接因子级别,r,dataframe,R,Dataframe,我有两列具有相同类型数据(字符串)的数据 我想连接列的级别。即我们有: col1 col2 Bob John Tom Bob Frank Jane Jim Bob Tom Bob ... ... (and so on) 现在col1有4个级别(Bob、Tom Frank、Jim),col2有3个级别(John、Jane、Bob) 但我希望两列都有所有的因子级别(Bob、Tom、Frank、Jim、Jane、John),以便以后用唯一的id替换每个“名称”,这

我有两列具有相同类型数据(字符串)的数据

我想连接列的级别。即我们有:

col1   col2
Bob    John
Tom    Bob
Frank  Jane
Jim    Bob
Tom    Bob
...    ... (and so on)
现在col1有4个级别(Bob、Tom Frank、Jim),col2有3个级别(John、Jane、Bob)

但我希望两列都有所有的因子级别(Bob、Tom、Frank、Jim、Jane、John),以便以后用唯一的id替换每个“名称”,这样最终的输出将是:

col1   col2
1      5
2      1
3      6
4      1
2      1
这是两列中的Bob->1、Tom->2等

col1 <- factor(c("Bob", "Tom", "Frank", "Jim", "Tom"))
col2 <- factor(c("John", "Bob", "Jane", "Bob", "Bob"))
mynames <- unique(c(levels(col1), levels(col2)))
fcol1 <- factor(col1, levels = mynames)
fcol2 <- factor(col2, levels = mynames)
有什么想法吗


编辑:谢谢大家的精彩回答!据我所知,你们都很棒:)

当我在下面写这篇令人憎恶的文章时,你们可以发誓这不起作用,但现在它起作用了:

## self contained example:
txt <- "col1   col2
Bob    John
Tom    Bob
Frank  Jane
Jim    Bob
Tom    Bob"
dat <- read.table(textConnection(txt), header = TRUE)
[原创:为了展示一个人写R代码是多么的愚蠢、复杂和混乱,他真的很努力!] 不确定这是否特别优雅(事实并非如此),但

我们首先取消列出数据:

tmp <- unlist(dat)
其中:

> dat2
     X1   X2
1   Bob John
2   Tom  Bob
3 Frank Jane
4   Jim  Bob
5   Tom  Bob
> sapply(dat2, levels)
     X1      X2     
[1,] "Bob"   "Bob"  
[2,] "Tom"   "Tom"  
[3,] "Frank" "Frank"
[4,] "Jim"   "Jim"  
[5,] "John"  "John" 
[6,] "Jane"  "Jane" 
> data.matrix(dat2)
     X1 X2
[1,]  1  5
[2,]  2  1
[3,]  3  6
[4,]  4  1
[5,]  2  1
或者一个更简单、更好的解决方案,基于@Gavin Simpson的以下提示,一步到位:

data.matrix(x)

您希望因子包括两列中的所有唯一名称

col1 <- factor(c("Bob", "Tom", "Frank", "Jim", "Tom"))
col2 <- factor(c("John", "Bob", "Jane", "Bob", "Bob"))
mynames <- unique(c(levels(col1), levels(col2)))
fcol1 <- factor(col1, levels = mynames)
fcol2 <- factor(col2, levels = mynames)

col1整洁、干净、快速。很好。虽然我更喜欢
data.frame(lappy(…
solution,出于纯粹的懒惰,+1你比我更容易找到一个合理的答案。你能把你的
as.numeric(x$col1)
改成
data.matrix(x)吗
?如果是这样,我将删除多余的答案。@aL3xa-嘿,不公平,我必须为键入的字符数获得分数!?;-)@Gavin,把你的帖子拿回来,这样我就可以+1了!=)@aL3xa现在开心吗?;-)如果我投了反对票,我知道该找谁了!;-)
x <- structure(list(col1 = structure(c(1L, 4L, 2L, 3L, 4L), .Label = c("Bob", "Frank", "Jim", "Tom"), class = "factor"), col2 = structure(c(3L, 1L, 2L, 1L, 1L), .Label = c("Bob", "Jane", "John"), class = "factor")), .Names = c("col1", "col2"), class = "data.frame", row.names = c(NA, -5L))
both <- union(levels(x$col1), levels(x$col2))
x$col1 <- factor(x$col1, levels=both)
x$col2 <- factor(x$col2, levels=both)
as.numeric(x$col1)
data.matrix(x)
col1 <- factor(c("Bob", "Tom", "Frank", "Jim", "Tom"))
col2 <- factor(c("John", "Bob", "Jane", "Bob", "Bob"))
mynames <- unique(c(levels(col1), levels(col2)))
fcol1 <- factor(col1, levels = mynames)
fcol2 <- factor(col2, levels = mynames)
mynames <- union(levels(col1), levels(col2))