2012-03-08 2 views
0

очень похожи: How to sort dataframe in R with specified column order preservation?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, но только в соответствии с значениями x1 y1
  • имеют порядок порядка 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 

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

> 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 и даже не уверен, что искать!


Per ниже предложения, вот исходные данные:

> 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") 

ответ

1

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

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

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

  1. selecti нг данных, где тип = 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,])

+0

Спасибо за помощь. Я упростил все выше и добавил 'dput (dat)' по запросу.Я собирался спросить, но теперь знаю ответ, попробовав это: «Какая вторая часть данных, а не x1?» В моей второй таблице я не ошибался, показывая, как я хочу, чтобы все было упорядочено. Я хотел бы отсортировать по переменным y1 x1, что даст мне заказ для вектора 'attr'; то я хотел бы отсортировать x2 с помощью порядка сортировки 'attr'. Я думаю, что я могу использовать ваш код для этого. Дай мне секунду. – Hendy

+0

Нет. Не получить его. Мне нужна эта первая половина, чтобы рассказать мне, в каком порядке она заканчивается, вставляя 'attrs' в (C, D, B, A); то мне нужно, чтобы вторая половина заказала себя так. Прямо сейчас, ваша функция дает мне x1 с порядком 'attrs' C, D, B, A, но x2 укладывается под ним в первоначальном порядке A, B, C, D. Надеюсь, это имеет смысл. – Hendy

+0

@Hendy: ahhh ... ОК, теперь я понял, я отредактирую свой ответ – nico

1

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

  1. xtabs превращает data.frame в 2D массив (таблица): attr матрицу с размерностью 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

От подмножества, где 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'r arrange функцию отсортировать 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 
Смежные вопросы