2014-12-08 2 views
3

Я новый пользователь R и новый для StackOverflow. Я сделаю все возможное, чтобы кратко и четко задать свой вопрос и извиниться, если он не будет передан наилучшим образом.переупорядочивание строк в dataframe в соответствии с порядком строк в другом информационном кадре

Я работаю с двумя кадрами данных. Я хочу изменить порядок строк одного фрейма данных так, чтобы он был идентичен порядку строк во втором ядре данных, поэтому я могу добавлять данные от одного к другому, причем их форматы являются одинаковыми. Столбец, который я хочу изменить порядок строк, представляет собой столбец с идентификаторами строковых символов различных областей наблюдения.

Первый dataframe "dfverif" выглядит (в целом), как

Variable Value 
DAFQX 9 
DAFQX 9 
DAFQX 9 
DAFQX 9 
DAHEI 9 
DAHEI 9 
DAHEI 9 
DAHEI 9 
BAARG 9  
BAARG 9  
BAARG 9 
BAARG 9 
CBUCG 9 
CBUCG 9 
CBUCG 9 
CBUCG 9 
DALZZ 9 
DALZZ 9 
DALZZ 9 
DALZZ 9 

Второй dataframe "dfmax" выглядит

variable value 
DALZZ 2.14 
DALZZ 2.02 
DALZZ 2.04 
CBUCG 1.83 
CBUCG 2.09 
CBUCG 1.96 
CBUCG 1.98 
DAHEI 2.25 
DAHEI 2.05 
DAHEI 2.08 
DAFQX 2.12 
DAFQX 2.12 
DAFQX 2.04 
BAARG 2.12 
BAARG 2.56 
BAARG 2.56 

Я хочу, чтобы изменить порядок строк второго dataframe в терминах порядка строк символьного вектора в первом кадре данных. Но есть много повторяющихся строк, потому что это данные временного ряда, поэтому я не могу использовать совпадение, и я не могу удалить дубликаты, потому что они содержат необходимые данные. Кроме того, второй блок данных намного меньше первого (это максимальные значения данных временного ряда, а не сырые наблюдения). Я знаю, что ограничивает cbind и rbind, но при необходимости можно использовать rbind.fill и cbindX, хотя я не уверен, что они здесь. На самом деле эти dataframes имеют больше столбцов, но я только включил здесь 2 для краткости.

Основываясь на вопрос здесь Order data frame rows according to a target vector that specifies the desired order

Я пытался делать это код

target <- dfverif 
idx <- sapply(target,function(x){ 
which(dfmax$variable==x) 
}) 
idx <- unlist(idx) ##I added this because the code gave me errors because idx is classified as a list so R couldn't do the dfmax[idx,] component 
dfmax <- dfmax[idx,] 
rownames(dfmist) <- NULL 

Но теперь, когда я голову (dfmax) Я получаю

[1] V1 V2 
<0 rows> (or 0-length row.names) 

Что я не могу сделать смысл, и когда я делаю str (dfmax), я получаю тот же порядок символов, что и раньше, ничего не изменилось. Я лаяю неправильное дерево? Есть ли другой способ приблизиться к этому, о котором я не знаю? Или я пытаюсь выполнить эту функцию неправильно?

Благодарим вас за внимание и помощь.

ответ

4

Я не согласен с тем, что match не может быть использован. Он возвращает, возможно, не уникальный результат, но вы ничего не сказали о необходимости вторичного сортировки, и если бы вы это сделали, его можно было бы легко добавить в качестве второго аргумента в order. Я тестировал это на разных приведенных подмножествах второго кадра данных, включая тот, который имел только отдельные экземпляры каждого из variable экземпляров.

Разница в длине не должна быть проблемой. Здесь я показываю с первым упорядоченность d2 («dfmax», короче) на d1 («dfverif», больше), а затем упорядочение d1 по d2:

d2[ order(match(d2$variable, d1$Variable)), ] 
    variable value 
11 DAFQX 2.12 
12 DAFQX 2.12 
13 DAFQX 2.04 
8  DAHEI 2.25 
9  DAHEI 2.05 
10 DAHEI 2.08 
14 BAARG 2.12 
15 BAARG 2.56 
16 BAARG 2.56 
4  CBUCG 1.83 
5  CBUCG 2.09 
6  CBUCG 1.96 
7  CBUCG 1.98 
1  DALZZ 2.14 
2  DALZZ 2.02 
3  DALZZ 2.04 
d1[ order(match(d1$Variable, d2$variable)), ] 

    Variable Value 
17 DALZZ  9 
18 DALZZ  9 
19 DALZZ  9 
20 DALZZ  9 
13 CBUCG  9 
14 CBUCG  9 
15 CBUCG  9 
16 CBUCG  9 
5  DAHEI  9 
6  DAHEI  9 
7  DAHEI  9 
8  DAHEI  9 
1  DAFQX  9 
2  DAFQX  9 
3  DAFQX  9 
4  DAFQX  9 
9  BAARG  9 
10 BAARG  9 
11 BAARG  9 
12 BAARG  9 
+0

теперь я вижу, что, но использование order (match (,)) все равно должен преуспеть, не так ли? –

+0

Мой ответ на самом деле породил неправильный результат, поэтому я удалил его. Твой путь: –

+1

Работал нормально в тестовых случаях, которые я сделал; Вы должны опубликовать в качестве редактирования в своем вопросе вывод 'dput (head (dfmax))' и 'dput (head (dverif))'. –

Смежные вопросы