【发布时间】: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 时,响应被转换为因子。可能我需要去(?)分解。