在同一data.frame中分组/重新编码因子

Bra*_*sen 7 r

假设我有一个这样的数据框:

df <- data.frame(a=letters[1:26],1:26)
Run Code Online (Sandbox Code Playgroud)

我想"重新"将因子a,b和c视为"a".

我怎么做?

Rei*_*son 14

一个选项是recode()包中的功能car:

require(car)
df <- data.frame(a=letters[1:26],1:26)
df2 <- within(df, a <- recode(a, 'c("a","b","c")="a"'))
> head(df2)
  a X1.26
1 a     1
2 a     2
3 a     3
4 d     4
5 e     5
6 f     6
Run Code Online (Sandbox Code Playgroud)

示例a不是那么简单,我们将几个级别重新编码为一个级别.

set.seed(123)
df3 <- data.frame(a = sample(letters[1:5], 100, replace = TRUE),
                  b = 1:100)
with(df3, head(a))
with(df3, table(a))
Run Code Online (Sandbox Code Playgroud)

最后一行给出:

> with(df3, head(a))
[1] b d c e e a
Levels: a b c d e
> with(df3, table(a))
a
 a  b  c  d  e 
19 20 21 22 18
Run Code Online (Sandbox Code Playgroud)

现在让我们结合水平ae成水平Z使用recode()

df4 <- within(df3, a <- recode(a, 'c("a","e")="Z"'))
with(df4, head(a))
with(df4, table(a))
Run Code Online (Sandbox Code Playgroud)

这使:

> with(df4, head(a))
[1] b d c Z Z Z
Levels: b c d Z
> with(df4, table(a))
a
 b  c  d  Z 
20 21 22 37
Run Code Online (Sandbox Code Playgroud)

在没有拼写出要合并的级别的情况下执行此操作:

## Select the levels you want (here 'a' and 'e')
lev.want <- with(df3, levels(a)[c(1,5)])
## now paste together
lev.want <- paste(lev.want, collapse = "','")
## then bolt on the extra bit
codes <- paste("c('", lev.want, "')='Z'", sep = "")
## then use within recode()
df5 <- within(df3, a <- recode(a, codes))
with(df5, table(a))
Run Code Online (Sandbox Code Playgroud)

这给我们与df4上面相同:

> with(df5, table(a))
a
 b  c  d  Z 
20 21 22 37 
Run Code Online (Sandbox Code Playgroud)


Pan*_*eni 13

有没有人尝试过这种简单的方法?它不需要特殊的包装,只需了解R如何处理因素.

假设您要重命名因子中的级别,获取其索引

data <- data.frame(a=letters[1:26],1:26)
lalpha <- levels(data$a)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我们想象我们想知道级别'e'和'w'的索引

lalpha <- levels(data$a)
ind <- c(which(lalpha == 'e'), which(lalpha == 'w'))
Run Code Online (Sandbox Code Playgroud)

现在我们可以用这个索引来代替因子'a'的水平

levels(data$a)[ind] <- 'X'
Run Code Online (Sandbox Code Playgroud)

如果你现在看一下数据帧因子,a那么会有一个X,其中有一个ew

我留给你试试结果.