我有非常大的数据,我需要选择满足特定标准的变量数进行分析(例如,线性模型中的变量)。下面的小数据说明了我的数据。
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)利用第一行值的差值计算相邻变量间的差值。例如,对于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!
发布于 2012-01-10 03:57:01
对列进行排序,以便第一行位于升序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)
}https://stackoverflow.com/questions/8798098
复制相似问题