从R中的分类变量创建互斥的虚拟变量

时间:2015-06-03 14:04:14

标签: r

前段时间,我问了一个关于从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

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

2 个答案:

答案 0 :(得分:3)

您可以试用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

希望这有帮助。

答案 1 :(得分:1)

如果您的数据是

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)