【问题标题】:Selection of different number of variables for a model in a dataframe为数据框中的模型选择不同数量的变量
【发布时间】:2012-01-10 03:09:21
【问题描述】:

我有非常大的数据框,我需要选择满足某些分析标准的变量数(例如线性模型中的变量)。下面的小数据说明了我的数据。

set.seed (1234) 
mydf <- data.frame (Id = c("dis", 1:5),

V1.a = c(0,sample(c(0, 1,2), 5, replace = T)),V1.b = c(0,sample(c(0, 1,2), 5, replace = T)),
V2.a = c(1.5,sample(c(0, 1,2), 5, replace = T)),V2.b = c(1.5,sample(c(0, 1,2), 5, replace = T)),
V3.a = c(2.0,sample(c(0, 1,2), 5, replace = T)),V3.b = c(2.0,sample(c(0, 1,2), 5, replace = T)),
V4.a = c(5.0,sample(c(0, 1,2), 5, replace = T)),V4.b = c(5.0,sample(c(0, 1,2), 5, replace = T)),
V5.a = c(6.0,sample(c(0, 1,2), 5, replace = T)),V5.b = c(6.0,sample(c(0, 1,2), 5, replace = T)),
V16a = c(11.0,sample(c(0, 1,2), 5, replace = T)),V6.b = c(11.0,sample(c(0, 1,2), 5, replace = T)),
V7.a = c(12.0,sample(c(0, 1,2), 5, replace = T)),V7.b = c(12.0,sample(c(0, 1,2), 5, replace = T)),
V8.a = c(3.0,sample(c(0, 1,2), 5, replace = T)),V8.b = c(3.0,sample(c(0, 1,2), 5, replace = T)))

打印数据:

   Id V1.a V1.b V2.a V2.b V3.a V3.b V4.a V4.b V5.a V5.b V6a V6.b V7.a V7.b V8.a V8.b
1 dis    0    0  1.5  1.5    2    2    6   6    7    7   11   11   12   12    3    3
2   1    1    2  1.0  1.0    2    0    0    1    2    1    2    0    0    2    0    2
3   2    1    2  2.0  0.0    2    0    2    1    2    1    0    0    2    1    1    1
4   3    2    0  1.0  2.0    1    1    1    0    2    0    1    2    0    2    1    0
5   4    0    1  1.0  1.0    1    1    0    1    0    2    2    2    2    1    0    2
6   5    1    0  2.0  2.0    0    2    1    2    1    1    1    0    2    2    2    2

这是我的目标:

(1) 按值对第一行中的列进行排序 - 除 ID 列外,从小到大(即 dis)。在缩短数据帧时考虑第一行

   Id   V1.a V1.b V2.a V2.b V3.a V3.b V4.a V4.b V5.a V5.b V6a V6.b V7.a V7.b V8.a V8.b
 1 dis    0    0  1.5  1.5    2    2    6   6    7    7   11   11   12   12    3    3

除 V8.a 和 V8.b 外,列(变量)按顺序排列。缩短的数据应按以下顺序排列:

   Id   V1.a V1.b V2.a V2.b V3.a V3.b V8.a V8.b V4.a V4.b V5.a V5.b V6a V6.b V7.a V7.b 
 1 dis    0    0  1.5  1.5    2    2   3   36   6    7    7   11   11   12   12    

(2) 然后计算di 通过第一行中值的差异,相邻变量之间的差异。例如,对于 V1a 和 V1b,差值为 0,而对于 V1.b 和 V2.a,差值为 1.5 - 0 = 1.5

基于row1的相邻变量之间的差异

V1.a - V1b   V1.b- V2.a  V2.a - V2b  V2.b - V3.a    V3.a - V3.b
    0-0      0 - 1.5    1.5 - 1.5     1.5 - 2        2-2       

等等……

(3) 除非按照 (2) 计算的相邻变量之间的差异小于 2,否则开始制作模型。一旦差异大于 2,将创建一个新模型并继续该过程,除非模型结束数据文件。第一行将不包含在模型中。

mydf1 =  mydf[-1,]   
model1 <- lm(Id ~ V1.a + V1.b + V2.a + V2.b + V3.a + V3.b + V8.a + V8.b, data = mydf1)
model2 <- lm(Id ~ V4.a + V4.b +  V5.a +  V5.b, data = mydf1)
model3 <- lm(Id ~ V6.a + V6.b + V7.a + V7.b, data = mydf1) 

如何使这个过程自动化?

编辑:按照答案

 d = mydf
> d
  Id V1.a V1.b V2.a V2.b V3.a V3.b V4.a V4.b V5.a V5.b V16a V6.b V7.a V7.b V8.a
1  0    0    0  1.5  1.5    2    2    5    5    6    6   11   11   12   12    3
2  1    1    2  1.0  0.0    1    2    1    2    0    1    1    2    0    1    1
3  2    1    1  2.0  2.0    1    2    0    1    0    1    1    1    0    2    0
4  3    0    0  1.0  2.0    2    0    2    2    2    2    2    1    1    2    0
5  4    0    2  0.0  2.0    2    2    1    1    2    2    2    1    2    1    0
6  5    2    1  2.0  0.0    2    0    1    1    0    1    0    0    0    2    1
  V8.b
1    3
2    2
3    0
4    2
5    0
6    2
>  d <- d[,order(d[1,-1])]
> d
  Id V1.a V1.b V2.a V2.b V3.a V7.b V8.a V3.b V4.a V4.b V5.a V5.b V16a V6.b V7.a
1  0    0    0  1.5  1.5    2   12    3    2    5    5    6    6   11   11   12
2  1    1    2  1.0  0.0    1    1    1    2    1    2    0    1    1    2    0
3  2    1    1  2.0  2.0    1    2    0    2    0    1    0    1    1    1    0
4  3    0    0  1.0  2.0    2    2    0    0    2    2    2    2    2    1    1
5  4    0    2  0.0  2.0    2    1    0    2    1    1    2    2    2    1    2
6  5    2    1  2.0  0.0    2    2    1    0    1    1    0    1    0    0    0

订购不适用于 V7.a !

【问题讨论】:

  • “从小到大(即dis)除了ID列”是什么意思?我们应该按哪一列排序,什么是“dis”?
  • “模型”看起来很奇怪:响应变量是因子...
  • @DavidRobinson 请查看我的编辑以澄清您的问题
  • @VincentZoonekynd 是的,这不是我想要的,但是当我在第一列中输入 dis 时,响应被转换为因子。可能我需要去(?)分解。

标签: r variables dataframe


【解决方案1】:

对列进行排序,使第一行升序order

d <- d[,c(1,1+order(d[1,-1]))]

计算差异d[1,i] - d[1,i-1](仅针对第一行):

d[1,-1] <- c(0, diff( drop(as.matrix(d[1,-1])) ))

将变量分组到块中:一次添加一个,如果上一步计算的差异为 2 或更多,则开始一个新组。

i <- 1+which( d[1,-1] >= 2 )
i <- data.frame( begin=c(2,i), end=c(i-1,dim(d)[2]) )

循环计算模型,每次创建一个新的data.frame:

models <- list()
for(k in 1:dim(i)[1]) {
  tmp <- d[-1, c(1, i$begin[k] : i$end[k])]
  tmp$Id <- as.numeric(as.character(tmp$Id))
  models[[k]] <- lm(Id ~ ., data=tmp)
}

【讨论】:

  • 感谢您的出色回答,我很惊讶地看到该订单不适用于 V7.b,其值为 12 !查看我的编辑
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多