在R中加入两列的因子级别

问题描述:

我有两列数据和相同类型的数据(字符串)。在R中加入两列的因子级别

我想加入列的级别。即。我们有:

col1 col2 
Bob John 
Tom Bob 
Frank Jane 
Jim Bob 
Tom Bob 
... ... (and so on) 
现在

col1中有4个级别(鲍勃,汤姆·弗兰克,吉姆)和col2上有3个级别(约翰·简,鲍勃)

但我想都列有所有的因子水平(鲍勃,汤姆,弗兰克,吉姆,简,约翰),作为后来一个唯一的ID代替每个“名字”的,使得最后的结果将是:

col1 col2 
1  5 
2  1 
3  6 
4  1 
2  1 

是鲍勃 - > 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) 

编辑:如果更换这个第三行更好一点:

mynames <- union(levels(col1), levels(col2)) 

敢发誓这个当我在写下面的憎恶没有工作,但现在这样:

## self contained example: 
txt <- "col1 col2 
Bob John 
Tom Bob 
Frank Jane 
Jim Bob 
Tom Bob" 
dat <- read.table(textConnection(txt), header = TRUE) 

只是计算组独特的水平和强迫每个colX的因素:

> dat3 <- dat 
> lev <- as.character(unique(unlist(sapply(dat, levels)))) 
> dat3 <- within(dat3, col1 <- factor(col1, levels = lev)) 
> dat3 <- within(dat3, col2 <- factor(col2, levels = lev)) 
> str(dat3) 
'data.frame': 5 obs. of 2 variables: 
$ col1: Factor w/ 6 levels "Bob","Tom","Frank",..: 1 2 3 4 2 
$ col2: Factor w/ 6 levels "Bob","Tom","Frank",..: 5 1 6 1 1 
> data.matrix(dat3) 
    col1 col2 
[1,] 1 5 
[2,] 2 1 
[3,] 3 6 
[4,] 4 1 
[5,] 2 1 

[原文:展示如何愚蠢复杂和模糊的人可以写R代码时有人试图真的很难] 不知道这是特别ELEG蚂蚁(它不是),而是......

我们先不公开的数据:

tmp <- unlist(dat) 

然后计算出独特的水平

lev <- as.character(unique(tmp)) 

,然后重组tmp(从上面)返回到与原始数据相同的维度,转换为data.frame(保留字符串),放在这个数据帧上,创建一个上面计算出的级别lev的因子,最后强制转换为数据帧。

dat2 <- data.frame(lapply(data.frame(matrix(tmp, ncol = ncol(dat)), 
            stringsAsFactors = FALSE), 
          FUN = factor, levels = lev)) 

其中给出:

> 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 

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)) 

而且relevel两个因素:

x$col1 <- factor(x$col1, levels=both) 
x$col2 <- factor(x$col2, levels=both) 

编辑完成后:添加例如从因素使数值

你可以简单地转换因子水平为数值,例如:

as.numeric(x$col1) 

或基于@Gavin辛普森的提示下面一步到位更简单,更好的解决方案:

data.matrix(x) 
+1

整洁,干净及快捷。好的。恕我直言更好回答@Gavin张贴,虽然我宁愿`data.frame(lapply(...`解决方案,出于纯粹的懒惰。 – aL3xa 2011-01-31 20:31:36