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