R сортировка / упорядочение суммированных переменных - PullRequest
0 голосов
/ 08 марта 2012

Очень похоже: Как отсортировать фрейм данных в R с заданным сохранением порядка столбцов?

Пример моих данных:

> dat
   type    attr   y1
1  x1         A 0.25
2  x1         B 0.19
3  x1         C 0.06
4  x1         D 0.13
5  x2         A 0.25
6  x2         B 0.00
7  x2         C 0.19
8  x2         D 0.00

Я создаю несколько разных сюжетов и хочу сделать следующее:

  • сортировка по y1, но только по значениям y1 для x1
  • имеет порядок x2 в зависимости от порядка, в котором находится attr после выполнения предыдущего шага

Другими словами, для этого примера я хочу получить результат:

> datsorted
   type    attr   y1
1  x1         C 0.06
2  x1         D 0.13 
3  x1         B 0.19 
4  x1         A 0.25
5  x2         C 0.19
6  x2         D 0.00
7  x2         B 0.00
8  x2         A 0.25

Единственный способ, которым я знал сейчас, был безумно утомительным. Я создал два подмножества кадра данных на основе значения type (один для x1, один для x2). Затем я создал новый фрейм данных:

> beside
   t1  t2   attr   x1y1  x2y1
1  x1  x2   A      0.25  0.25
2  x1  x2   B      0.19  0.00
3  x1  x2   C      0.06  0.19
4  x1  x2   D      0.13  0.00

Таким образом, я могу отсортировать по x1y1 и сохранить все вместе ... но затем мне придется заново разделить его на длинные формы для построения графика. Там должен быть лучший путь. Извините, если я пропустил другой ответ; Я новичок в R и даже не уверен, что искать!


Согласно приведенному ниже предложению, вот необработанные данные:

> dput(dat)
structure(list(type = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L), .Label = c("x1", "x2"), class = "factor"), attr = structure(c(1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), 
    y1 = c(0.25, 0.19, 0.06, 0.13, 0.25, 0, 0.19, 0)), .Names = c("type", 
"attr", "y1"), row.names = c(NA, -8L), class = "data.frame")

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Вот решение в три этапа:

  1. xtabs преобразует ваш data.frame в 2D-массив (таблицу): attr -by- type
  2. сортировка массива по attr измерению
  3. возврат к data.frame с использованием as.data.frame.table

a <- xtabs(y1 ~ attr + type, dat)
a
#     type
# attr   x1   x2
#    A 0.25 0.25
#    B 0.19 0.00
#    C 0.06 0.19
#    D 0.13 0.00

b <- a[order(a[, "x1"]), ]
b
#     type
# attr   x1   x2
#    C 0.06 0.19
#    D 0.13 0.00
#    B 0.19 0.00
#    A 0.25 0.25

as.data.frame.table(b, responseName = "y")
#   attr type    y
# 1    C   x1 0.06
# 2    D   x1 0.13
# 3    B   x1 0.19
# 4    A   x1 0.25
# 5    C   x2 0.19
# 6    D   x2 0.00
# 7    B   x2 0.00
# 8    A   x2 0.25
1 голос
/ 09 марта 2012

Из подмножества, где type равно x1:

dat.x1 <- subset(dat, type == "x1")

, найдите атрибуты, соответствующие увеличивающимся значениям y1:

ord.attr <- dat.x1$attr[order(dat.x1$y1)]
ord.attr
# [1] C D B A
# Levels: A B C D

, затем используйте ply'rarrange функция для сортировки ваших data.frame:

require(plyr)
arrange(dat, type, match(attr, ord.attr))
#   type attr   y1
# 1   x1    C 0.06
# 2   x1    D 0.13
# 3   x1    B 0.19
# 4   x1    A 0.25
# 5   x2    C 0.19
# 6   x2    D 0.00
# 7   x2    B 0.00
# 8   x2    A 0.25
1 голос
/ 08 марта 2012

Если я хорошо понимаю, что вы хотите сделать, вы можете использовать:

ord <- order(dat[dat$type=="x1",]$y1)
dat.sorted <- rbind(dat[ord,], dat[ord + 4,])

По сути, это то, что вы делаете:

  1. выбор данных, где тип= x1

    dat[dat$type=="x1",]

  2. получение порядка y1 в тех и помещение его в ord

    order(dat[dat$type=="x1",]$y1)

  3. заказать ваши (частичные) данные

    dat[ord,]

  4. упорядочить остальные данные в качестве первой части
    ПРИМЕЧАНИЕ: это работает, только если первые 4 элемента x1, а вторые 4 x2

    dat[ord+4,]

  5. слияние с заказанными данными

    dat.sorted <- rbind(dat[ord,], dat[ord+4,])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...