我正在尝试将一堆事务转换为宽矩阵,以便运行一些回归模型。
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
...
有什么建议吗?
答案 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)
这应该有用。