rbind и перезаписать повторяющиеся строки на основе ключевой переменной?

> part1<-data.frame(key=c(5,6,7,8,9),x=c("b","d","a","c","b"))
> part1
  key x
1   5 b # key==5,x==b
2   6 d
3   7 a
4   8 c
5   9 b
> part2<-data.frame(key=c(1,2,3,4,5), x=c("c","a","b","d","a"))
> part2
  key x
1   1 c
2   2 a
3   3 b
4   4 d
5   5 a # key==5,x==a

Существует более двух фреймов данных, но в этом примере я использую только два. Затем я использую lapply, чтобы поместить их все в список с именем dflist1, а затем связывать их rbind. В этом примере я просто сделаю это вручную.

dflist1<-list(part1,part2)
final<-do.call(rbind,dflist1)
final<-final[order(final$key),] #sort by key

Результат:

> final
   key x
6    1 c
7    2 a
8    3 b
9    4 d
1    5 b #duplicate from part1
10   5 a #duplicate from part2
2    6 d
3    7 a
4    8 c
5    9 b

Я хочу избавиться от дубликатов. Это легко использовать! Duplicated (), но в этом случае я специально хочу отбросить / перезаписать строки из более ранних фреймов данных - то есть в этом случае «5 b» из части 1 должно быть удалено / перезаписано «5 a» из части 2 . И если бы была часть 3 со значением «5 b», тогда «5 a» из части 2 затем было бы отброшено / перезаписано «5 b» из части 3.

Что я хочу:

   key x
6    1 c
7    2 a
8    3 b
9    4 d
10   5 a #this is from part2, no more duplicate from part1
2    6 d
3    7 a
4    8 c
5    9 b

Текущее решение: единственное, что я могу придумать, - это добавить функцию, которая помечает каждый фрейм данных дополнительной переменной, затем сортирует ее и использует! Duplicated для этой переменной ... есть ли более простое или более элегантное решение, которое не требует помечает?


person winampman    schedule 26.03.2014    source источник
comment
подсказка: используйте data.table(), setkey(), unique()   -  person Ricardo Saporta    schedule 27.03.2014
comment
Также обратите внимание, что функция сортировки R является стабильным алгоритмом сортировки и сохраняет спутниковые данные, поэтому вы можете просто перевернуть, использовать! duplicated и снова перевернуть.   -  person Robert Krzyzanowski    schedule 27.03.2014
comment
Может быть, fromLast = T аргумент duplicated мог бы пригодиться? Например. final[!duplicated(final$key, fromLast = T), ] похоже на ваш результат   -  person alexis_laz    schedule 27.03.2014


Ответы (1)


person    schedule
comment
Извините за это, но исходный постер не принял этот ответ и не продолжил его. Я нахожусь в той же ситуации, что и они (за исключением того, что я использую несколько ключей), и этот ответ лишь немного не работает. Я хочу иметь возможность сохранить последнюю из ключевых записей, а не первую. Это работает отлично, за исключением того, что он сохраняет первый ключ (5, r) вместо предполагаемого (5, w). Зависит ли порядок ключей от того, в каком порядке вы связываете различные фреймы данных? - person Kyle S.; 28.10.2014
comment
Привет, @kyles. Вы можете опубликовать новый вопрос и просто дать ссылку на него. (Пишу с телефона сюда) - person Ricardo Saporta; 28.10.2014