5

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

4

2 回答 2

4

一个data.table解决方案。data.frame这在大型's 上也应该非常快。

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]

这应该给你你所期望的。

于 2013-02-09T23:20:25.887 回答
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%

于 2013-02-09T22:53:56.170 回答