У меня очень большой фрейм данных, и мне нужно выбрать переменное число, удовлетворяющее определенным критериям анализа (например, переменные в линейной модели). Следующие небольшие данные иллюстрируют мои данные.
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) Сортировать столбцы по значению в первой строке - от меньшего к большему (т. Е. Dis), за исключением столбца ID. Рассмотрим первую строку при сокращении кадра данных
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
.
разница между смежными переменными на основе строки1
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!