R dummyvars - 单列的虚拟变量
R dummyvars - dummy variables for a single column
我正在尝试将一堆交易转换为宽矩阵,以 运行 一些回归模型。
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
...
有什么建议吗?
这是一个使用 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
希望对您有所帮助!
如果我们使用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))
你犯了一个很小的错误。
使用像这样的预测命令:
df2 <- predict(dv1, newdata = res1)
View(df2)
这应该有效。
我正在尝试将一堆交易转换为宽矩阵,以 运行 一些回归模型。
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
...
有什么建议吗?
这是一个使用 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
希望对您有所帮助!
如果我们使用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))
你犯了一个很小的错误。 使用像这样的预测命令:
df2 <- predict(dv1, newdata = res1)
View(df2)
这应该有效。