【问题标题】:Looking for a more concise way to recategorise a variable寻找一种更简洁的方法来重新分类变量
【发布时间】:2014-04-22 10:24:07
【问题描述】:

我有一个整数年龄向量,我想将其转换为多个类别:

ages <- round(runif(10, 0, 99))

现在我希望根据年龄将此变量分为三类。我想要一个输出对象 ages.cat 看起来像这样:

   young mid old
1      0   0   1
2      1   0   0
3      1   0   0
4      1   0   0
5      1   0   0
6      0   1   0
7      1   0   0
8      0   0   1
9      0   1   0
10     0   1   0

目前我正在使用以下代码创建这个对象:

ages.cat <- array(0, dim=c(10,3)) # create categorical object for 3 bins
ages.cat[ages < 30, 1] <- 1
ages.cat[ages >= 30 & ages < 60, 2] <- 1
ages.cat[ages >= 60, 3] <- 1

ages.cat <- data.frame(ages.cat)
names(ages.cat) <- c("young", "mid", "old")

必须有一种更快、更简洁的方法来重新编码这些数据 - 与 dplyr 玩过 但无法通过其功能找到解决此特定问题的方法。有任何想法吗?在基础 R 中或使用包解决这个问题的“规范”解决方案是什么?不管有什么替代方案,我确信它们会比我笨拙的代码更简洁!

【问题讨论】:

  • ?model.matrix 可能很有用。例如。类似model.matrix(ages ~ cut(ages, c(0, 30, 60, Inf)) - 1)
  • 还有一个与原答案类似的问题here

标签: r dplyr


【解决方案1】:

它的两个单行。

使用cut 创建一个因子:

ages <- round(runif(10, 0, 99))
ageF=cut(ages,c(-Inf,30,60,Inf),labels=c("young","mid","old"))
> ageF
 [1] young mid   young young old   mid   old   young old   old  
Levels: young mid old

通常你会把它作为一个因素并使用它,如果你使用 R 的建模函数,他们会为你计算出矩阵。但如果你自己做:

使用model.matrix 创建矩阵,使用-1 删除截距并为每个级别创建列:

> m = model.matrix(~ageF-1)
> m
   ageFyoung ageFmid ageFold
1          1       0       0
2          0       1       0
3          1       0       0
4          1       0       0
5          0       0       1
6          0       1       0
7          0       0       1
8          1       0       0
9          0       0       1
10         0       0       1
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$ageF
[1] "contr.treatment"

最后你可以忽略所有对比的东西,它只是一个带有一些额外属性的矩阵用于建模。

【讨论】:

【解决方案2】:

试试这个:

library(dplyr)

ages <- 
  data.frame(ages = round(runif(10, 0, 99))) %.%
  mutate(id = 1:n(), 
         cat = factor(ifelse(ages < 30, "young",
                             ifelse(ages >= 30 & ages < 60, 
                                    "mid", "old")))) %.%
  dcast(id ~ cat, value.var = 'ages', length)

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多