2016-05-19 2 views
0

мне нужно агрегировать строки кадра данных с большим числом строк таким образом:Как установить приоритет при агрегировании строк фрейма данных?

Допустит, у меня есть две строки, которые я хочу, чтобы объединить (так как они имеют один и тот же первый элемент):

x1=c(ID1,1,3,2,1,NA); 
    x2=c(ID1,2,2,3,NA,NA); 

Я хочу объединить их значения так, чтобы результат был в случае столкновения (clash = обе строки имеют значение non-NA в элементе) предпочитают значение в строке с более высоким значением во втором элементе (то есть x2).

Таким образом, в данном примере результат агрегации у этих двух строк будет:

x12=c(ID1,2,2,3,1,NA) 

Может кто-нибудь, пожалуйста, помогите? Я попытался aggregate(), но предлагает только сводные статистические данные, как среднее, максимальное и т.д.

+0

Может ли быть более 1 ID1 на одной информационной карте или это уникально? можете ли вы дать образец данных (2 кадра данных)? неясно, хотите ли вы, чтобы функция получала x1 и x2 в качестве входных и выходных данных x12 или решение для обоих фреймов данных. –

+0

Просьба предоставить образцы данных, которые представляют, что вы хотите сделать. Вы говорите, что хотите «объединить» два data.frames по строкам, но только предоставили два вектора. Ниже приведены советы по созданию минимального примера (http://stackoverflow.com/help/mcve), а также этого для создания [примеров в R] (http://stackoverflow.com/questions/5963269/how- к-макияж а-пра-р-воспроизводимый-пример). – lmo

ответ

1

Вы можете использовать max в качестве функции для функции aggregate.

данных:

x1=c('ID1',1,2,1,NA) 
x2=c('ID1',3,3,NA,NA) 

data <- data.frame(rbind(x1, x2), stringsAsFactors = FALSE) 

Агрегирование:

aggregate(data[,2:5], by = list(name = data$X1), FUN = max, na.rm = TRUE) 

Результат:

name X2 X3 X4 X5 
1 ID1 3 3 1 <NA> 
+0

Я хотел бы объединиться, следуя правилу «если в векторе x2 есть значение, отличное от NA, тогда сохраните это значение, иначе сохраните значение из x1». то есть со входами: 'x1 = c (' ID1 ', 3,2,1, NA) x2 = c (' ID1 ', 2,3, NA, NA)' выход будет 'x12 = c (ID1,2,3,1, NA) '(мой реальный набор данных, конечно, намного больше). –

+0

Пожалуйста, см. Комментарий @lmo first и, пожалуйста, отредактируйте исходный вопрос, чтобы отразить то, что вы ищете. – elevendollar

0

Вы можете использовать SQL с помощью пакета sqldf.

Использование sql вы можете group by ID и selectmax указанных вами ценностей.

require(data.table) 
require(sqldf) 
x1 <- c(1,1,2,1,NA) 
x2 <- c(1,3,3,NA,NA) 
x <- data.table(rbind(x1,x2)) 
colnames(x) <- c("ID", "x1", "x2", "x3", "x4") 

sqldf("select ID, max(x1) as x1, max(x2) as x2, max(x3) as x3, max(x4) as x4 from x group by ID") 

    ID x1 x2 x3 x4 
1 1 3 3 1 NA 
Смежные вопросы