我有一个数据框,这些值为虚拟值,我想对它们进行lm回归。其中一个变量是分组连续变量,如下所示
df <- data.frame("y" = c(10, 11, 12, 13, 14),
"x" = as.factor(c("100-102", "103-105", "106-108", "109-111", "112-114")))
我想回归y~x,一种方法是用它们的平均数值替换x因子。这可以使用正则表达式轻松完成。
另一种方法是创建其他行并展开数据集,使其看起来像这样
data.frame("y" = c(10, 10, 10, 11, 11, 11......),
"x" = c(100, 101, 102, 103, 104, 105......))
有没有这样做的功能?
我正在考虑首先创建其他变量,如x1,x2,x3,然后使用reshape2包将x列转换为行。
答案 0 :(得分:4)
data.table
解决方案。这对于大data.frame
也应该非常快。
require(data.table)
dt <- data.table(df, key="y")
dt[, list(x=seq(sub("-.*$", "", x), sub(".*-", "", x))),by=y]
如果您有更多列,并且在按列x
拆分时不希望每个组合,那么这是要使用的代码:
require(data.table)
dt <- data.table(df)
# get all column names except "x"
key.cols <- setdiff(names(df), "x")
# set the data.table columns to key.cols
setkeyv(dt, key.cols)
dt.out <- dt[, list(x=seq(sub("-.*$", "", x), sub(".*-", "", x))), by = key.cols]
这应该可以满足你的期望。
答案 1 :(得分:2)
require(stringr)
require(foreach)
foreach(i=1:nrow(df), .combine=rbind) %do% {
s <- as.numeric(str_extract_all(df$x[i], "[0-9]+")[[1]])
data.frame(y=rep(df$y[i], s[2]-s[1]+1), x=seq(s[1], s[2]))
}
如果您的data.frame
非常大,则可以使用%dopar%
。