假设我有一个这样的数据框:
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)
现在让我们结合水平a和e成水平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,其中有一个e和w
我留给你试试结果.