Объединение фреймов данных без дублирования строк - PullRequest
10 голосов
/ 12 января 2012

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

From? Merge: Строки в двух фреймах данных, которые соответствуют указанным столбцам, извлекаются и объединяются. Если найдено более одного совпадения, все возможные совпадения содержат по одной строке.

Вот пример кода:

days <- as.data.frame(as.Date(c("2012-1-1", "2012-1-2", "2012-1-3", "2012-1-4")))

names(days) <- "Date"
obs.days <- as.data.frame(as.Date(c("2012-1-2", "2012-1-3", "2012-1-3")))
obs.days$count <- 1
colnames(obs.days) <- c("Date", "Count")
df <- merge(days, obs.days, by.x="Date", by.y="Date", all.x=TRUE)

Я бы хотел, чтобы окончательный фрейм данных только один раз перечислял 2012-1-3 со значением счетчика 2.

1 Ответ

6 голосов
/ 12 января 2012

Я бы посоветовал вам объединить их, а затем объединить их (по сути, выполнить СУММУ для каждого уникального Date).

df <- merge(z.days,obs.days, by.x="Date", by.y="Date", all.x=TRUE)
        Date Count
1 2012-01-01    NA
2 2012-01-02     1
3 2012-01-03     1
4 2012-01-03     1
5 2012-01-04    NA

Теперь, чтобы выполнить слияние, вы можете использовать aggregate:

df2 <- aggregate(df$Count,list(df$Date),sum)
     Group.1  x
1 2012-01-01 NA
2 2012-01-02  1
3 2012-01-03  2
4 2012-01-04 NA
names(df2)<-names(df)

НО я бы порекомендовал пакет plyr, который потрясающий! В частности, функция ddply.

library(plyr)
ddply(df,.(Date),function(x) data.frame(Date=x$Date[1],Count=sum(x$Count)))
        Date Count
1 2012-01-01    NA
2 2012-01-02     1
3 2012-01-03     2
4 2012-01-04    NA

Команда ddply(df,.(Date),FUN) по существу делает:

for each date in unique(df$Date):
    add to output dataframe FUN( df[df$Date==date,] )

Итак, предоставленная мною функция создает фрейм данных из одной строки со столбцами Date и Count, представляющими собой сумму всех подсчетов на эту дату.

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