将分组的连续变量转换为R中的行

时间:2013-02-09 22:32:09

标签: r linear-regression

我有一个数据框,这些值为虚拟值,我想对它们进行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列转换为行。

2 个答案:

答案 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%