【问题标题】:Converting column factors into columns containing binary将列因子转换为包含二进制的列
【发布时间】:2015-04-20 14:51:27
【问题描述】:

我有如下数据:

> View(mydata)   

   Gender   Race  Agegroup  Date       ..... #m columns
#1 Male   Asian     1      2015/04/20 .....
#2 Female  White    2      2015/04/15 .....
.
.
#n rows

我想把 mydata 转换成这种格式:

Gender=Male  Gender=Female  Race=Asian  Race=White   Agegroup = 1   Agegroup = 2 ......
    1             0              0             0              1               0
    0             1              0             1              0               1
    .             .              .             .              .               .
    .             .              .             .              .               .

我是 R 新手,我知道 for 循环会起作用,但有没有更简洁的方法来做到这一点?

【问题讨论】:

标签: r


【解决方案1】:

您可以使用model.matrix 在一次调用中展开多个变量:

(d <- data.frame(Gender=c("Male", "Male", "Female", "Male"), Race=c("White", "Asian", "White", "Black"), AgeGroup=factor(c(1, 2, 2, 1))))
#   Gender  Race AgeGroup
# 1   Male White        1
# 2   Male Asian        2
# 3 Female White        2
# 4   Male Black        1

model.matrix(~.+0, data=d, contrasts.arg=sapply(d, contrasts, contrasts=F))
#   GenderFemale GenderMale RaceAsian RaceBlack RaceWhite AgeGroup1 AgeGroup2
# 1            0          1         0         0         1         1         0
# 2            0          1         1         0         0         0         1
# 3            1          0         0         0         1         0         1
# 4            0          1         0         1         0         1         0
# ...

model.matrix 调用的contrasts.args 位是来自here 的代码,以确保所有因素的所有级别都显示在您的输出中。

【讨论】:

  • 我注意到名称被分解但整数没有。有两者兼得的功能吗?
  • @GuanhuaLee 我已经更新了代码以包含一个采用整数值的变量。请注意,您需要将其转换为 model.matrix 的因子以将其拆分为单独的列。例如,您可以使用d$AgeGroup &lt;- factor(d$AgeGroup)
【解决方案2】:

你可以使用包 reshape2:

DF <- data.frame(gender = c("m", "f", "m"),
                 agegroup = factor(c(1, 2, 2)))


library(reshape2)
dum <- lapply(names(DF), function(x, df) {
  d <- df[, x, drop = FALSE]
  d$id = seq_along(d[, 1])
  res <- dcast(d , id ~ ..., fun.aggregate = length)
  names(res)[-1] <- paste(names(d)[1], names(res)[-1], sep ="=")
  res
}, df = DF)


Reduce(merge, dum)
#  id gender=f gender=m agegroup=1 agegroup=2
#1  1        0        1          1          0
#2  2        1        0          0          1
#3  3        0        1          0          1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2023-02-03
    • 2021-07-12
    • 2019-04-02
    • 2016-03-03
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多