我有2列数据,具有相同类型的数据(字符串)。
我想加入列的级别。即。我们有:
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
那是鲍勃 - > 1,汤姆 - >两列中的2等。
任何想法:)?
编辑:感谢大家的精彩答案!据我所知,你们都很棒。)
答案 0 :(得分:11)
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)
或者更简单,更好的解决方案基于@Gavin Simpson的一步提示:
data.matrix(x)
答案 1 :(得分:5)
您希望这些因素包含两列中的所有唯一名称。
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))
答案 2 :(得分:2)
当我在下面写下令人憎恶的事情时,可能会发誓这不起作用,但现在确实如此:
## 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代码的愚蠢复杂和混淆,人们会非常努力! 不确定这是否特别优雅(但事实并非如此),但是......
我们首先将数据取消列出:
tmp <- unlist(dat)
然后计算唯一级别
lev <- as.character(unique(tmp))
然后将tmp
(从上面)重新调整回与原始数据相同的维度,转换为data.frame(保留字符串),对此数据框进行重新设置,创建一个级别为{{1的因子在上面计算,最后强制转换为数据框。
lev
给出了:
dat2 <- data.frame(lapply(data.frame(matrix(tmp, ncol = ncol(dat)),
stringsAsFactors = FALSE),
FUN = factor, levels = lev))