R dummyvars - 单列的虚拟变量

时间:2017-09-29 21:41:04

标签: r r-caret dummy-variable

我正在尝试将一堆事务转换为宽矩阵,以便运行一些回归模型。

Trans_id     item_id
  123         ABC
  123         DEF
  123         XYZ
  345         ABC
  ...         ...

我想转换成这样的东西:

Trans_id     item_ABC    item_DEF   item_XYZ   
  123            1           1          1
  345            1           0          0 

我正在尝试使用插入符号中的dummyVars函数来执行此操作,但无法使其执行我需要的操作。

dv1 <- dummyVars(Trans_id ~ item_id , data = res1)
df2 <- predict(dv1, res1)

只给我一个没有虚拟矩阵的item_id列表。

 item_id
   ABC
   DEF
   XYZ
   ABC
   ...

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

如果我们使用data.table,则可以使用dcast

library(data.table)
dcast(setDT(data), Trans_id ~ paste0("item_", item_id), length)
#   Trans_id item_ABC item_DEF item_XYZ
#1:      123        1        1        1
#2:      345        1        0        0

或者更通用的方法是

dcast(setDT(data), Trans_id ~ paste0("item_", item_id), function(x) as.integer(length(x)>0))

数据

data <- structure(list(Trans_id = c(123L, 123L, 123L, 345L), item_id = structure(c(1L, 
2L, 3L, 1L), .Label = c("ABC", "DEF", "XYZ"), class = "factor")),
 .Names = c("Trans_id", 
"item_id"), class = "data.frame", row.names = c(NA, -4L))

答案 1 :(得分:0)

以下是使用data.table的解决方案:

# load the data
data = read.table(
  text = 
"
Trans_id     item_id
  123         ABC
  123         DEF
  123         XYZ
  345         ABC
",
  header = TRUE
);

# load data table
library(data.table);

# make a data table
dt = setDT(x = data)[
  ,
  # make a count column for each item in each group
  .(
    item_ABC = length(x = which(x = item_id == "ABC")),
    item_DEF = length(x = which(x = item_id == "DEF")),
    item_XYZ = length(x = which(x = item_id == "XYZ"))
  ),
  # grouping by Trans_id
  by = Trans_id
];

# display the new table
dt;

       Trans_id item_ABC item_DEF item_XYZ
1:      123        1        1        1
2:      345        1        0        0

我希望这可以提供帮助!

答案 2 :(得分:0)

你犯的是一个很小的错误。 使用预测命令,如:

df2 <- predict(dv1, newdata = res1)
View(df2)

这应该有用。