【问题标题】:Create mutually exclusive dummy variables from categorical variable in R [duplicate]从R中的分类变量创建互斥虚拟变量[重复]
【发布时间】:2015-08-17 19:12:40
【问题描述】:

不久前,我问了一个关于从mutually exclusive dummy variables 创建分类变量的问题。现在,事实证明我想做相反的事情。

如何从单个分类变量 (time) 在长格式数据集中创建虚拟变量?例如下面的数据框...

id     time   
1      1       
1      2       
1      3      
1      4       

会变成……

id     time    time_dummy_1   time_dummy_2    time_dummy_3  time_dummy_4
1      1       1              0               0             0
1      2       0              1               0             0
1      3       0              0               1             0
1      4       0              0               0             1

我确定这是微不足道的(如果这个问题是重复的,请告诉我——我不确定它是否是重复的,但如果是这样,我很乐意删除)。谢谢!

【问题讨论】:

  • 你能举一个输入/输出的例子吗?这还不完全清楚。
  • 如果你使用library(tidyr)library(plyr),那就是:df %>% mutate(time2=paste0("time_dummy_",time)) %>% spread(time2, id, fill=0)

标签: r


【解决方案1】:

您可以尝试dummies 库。

R 代码:

# Creating the data frame
# id <- c(1,1,1,1)
# time <- c(1,2,3,4)
# data <- data.frame(id, time)

install.packages("dummies")
library(dummies)
data <- cbind(data, dummy(data$time))

输出:

  id time data1 data2 data3 data4
   1    1     1     0     0     0
   1    2     0     1     0     0
   1    3     0     0     1     0
   1    4     0     0     0     1

您还可以重命名新添加的虚拟变量标题以满足您的需要

R 代码:

# Rename column headers
colnames(data)[colnames(data)=="data1"] <- "time_dummy_1"
colnames(data)[colnames(data)=="data2"] <- "time_dummy_2"
colnames(data)[colnames(data)=="data3"] <- "time_dummy_3"
colnames(data)[colnames(data)=="data4"] <- "time_dummy_4"

输出:

  id time time_dummy_1 time_dummy_2 time_dummy_3 time_dummy_4
   1    1            1            0            0            0
   1    2            0            1            0            0
   1    3            0            0            1            0
   1    4            0            0            0            1

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果你的数据是

    id <- c(1,1,1,1)
    time <- c(1,2,3,4)
    df <- data.frame(id,time)
    

    你可以试试

    time <- as.character(time)
    unique.time <- as.character(unique(df$time))
    # Create a dichotomous dummy-variable for each time
    x <- sapply(unique.time, function(x)as.numeric(df$time == x))
    

    time.f = factor(time)
    dummies = model.matrix(~time.f)
    

    【讨论】:

    • model.matrix+1!这真的很整洁。 This answermodel.matrix 将 time=1 视为默认值或截距值,但是您如何“通过与 model.matrix 中的 contrasts.arg 混淆来更改“默认”的选择方式”?以及如何分配表中的dummy_time_1 列?
    • @Synergist ;您可以通过添加0-1 来抑制拦截。所以model.matrix(~0 + time.f)。对于更多变量,获取每个因子的所有 levelx 变得有点棘手.. 请参阅here 以获得简洁的方法
    • @user20650 谢谢!
    猜你喜欢
    • 2020-05-13
    • 2013-04-14
    • 2017-05-31
    • 1970-01-01
    • 2011-03-24
    • 2023-03-14
    • 2015-08-20
    • 2023-03-24
    • 2021-12-15
    相关资源
    最近更新 更多