2014-02-01 2 views
-1

У меня есть два кадра данных, которые я хотел бы сопоставить на основе значений в столбце (столбец «gridcell»), присутствующего в обоих кадрах данных. Это было бы легкой задачей, если бы не тот факт, что это нужно делать отдельно для каждой уникальной даты в кадрах данных.Как сопоставить два кадра данных по значениям столбцов в подблоках кадра данных?

Ниже приведены примеры, данные:

> dput(df1) 
structure(list(index = 1:7, date = c("13/04/2011", "13/04/2011", 
"04/04/2011", "04/04/2011", "04/04/2011", "28/03/2011", "28/03/2011" 
), yrday = c(103L, 103L, 94L, 94L, 94L, 87L, 87L), gridcell = c(6L, 
9L, 2L, 5L, 8L, 3L, 4L), dist = c(178L, 158L, 137L, 116L, 95L, 
135L, 115L), ang = c(148, 147.6, 163.6, 159.7, 152.5, 152.2, 
121.9)), .Names = c("index", "date", "yrday", "gridcell", "dist", 
"ang"), class = "data.frame", row.names = c(NA, -7L)) 

> dput(df2) 
structure(list(date = c("28/03/2011", "28/03/2011", "28/03/2011", 
"28/03/2011", "28/03/2011", "28/03/2011", "28/03/2011", "28/03/2011", 
"28/03/2011", "29/03/2011", "29/03/2011", "29/03/2011", "29/03/2011", 
"29/03/2011", "29/03/2011", "29/03/2011", "29/03/2011", "29/03/2011", 
"04/04/2011", "04/04/2011", "04/04/2011", "04/04/2011", "04/04/2011", 
"04/04/2011", "04/04/2011", "04/04/2011", "04/04/2011", "13/04/2011", 
"13/04/2011", "13/04/2011", "13/04/2011", "13/04/2011", "13/04/2011", 
"13/04/2011", "13/04/2011", "13/04/2011"), yrday = c(87L, 87L, 
87L, 87L, 87L, 87L, 87L, 87L, 87L, 88L, 88L, 88L, 88L, 88L, 88L, 
88L, 88L, 88L, 94L, 94L, 94L, 94L, 94L, 94L, 94L, 94L, 94L, 103L, 
103L, 103L, 103L, 103L, 103L, 103L, 103L, 103L), gridcell = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L), r = c(161L, 162L, 162L, 164L, 167L, 168L, 169L, 
170L, 170L, 171L, 170L, 169L, 168L, 158L, 160L, 162L, 164L, 165L, 
263L, 258L, 255L, 250L, 246L, 242L, 239L, 238L, 228L, 235L, 234L, 
231L, 230L, 229L, 228L, 227L, 243L, 242L)), .Names = c("date", 
"yrday", "gridcell", "r"), class = "data.frame", row.names = c(NA, 
-36L)) 

> head(df1) 
    index  date yrday gridcell dist ang 
1  1 13/04/2011 103  6 178 148.0 
2  2 13/04/2011 103  9 158 147.6 
3  3 04/04/2011 94  2 137 163.6 
4  4 04/04/2011 94  5 116 159.7 
5  5 04/04/2011 94  8 95 152.5 

> head(df2) 
     date yrday gridcell r 
1 28/03/2011 87  1 161 
2 28/03/2011 87  2 162 
3 28/03/2011 87  3 162 
4 28/03/2011 87  4 164 
5 28/03/2011 87  5 167 

Я хотел бы в конечном итоге с кадра данных новый df1, который включает в себя соответствующий ряд из df2, основанного на идентичные «GridCell» значения в пределах каждой даты (как показано ниже):

index  date_1 yrday_1 gridcell_1 dist ang yrday_2 gridcell_2 r 
1  1 13/04/2011  103   6 178 148.0  103   6 228 
2  2 13/04/2011  103   9 158 147.6  103   9 242 
3  3 04/04/2011  94   2 137 163.6  94   2 258 
4  4 04/04/2011  94   5 116 159.7  94   5 246 
5  5 04/04/2011  94   8 95 152.5  94   8 238 
6  6 28/03/2011  87   3 135 152.2  87   3 162 
7  7 28/03/2011  87   4 115 121.9  87   4 164 

до сих пор я пытался объединения двух кадров данных в колонке «дата», которая дает новый кадр данных, в которой каждая строка из df1 повторяется по количеству строк на дату согласования в df2 (т.е. всякое возможное значение «gridcell» из df2 сопоставляется с t он уникальная строка df1).

df1$date = as.Date(df1$date, format="%d/%m/%Y") 
df2$date = as.Date(df2$date, format="%d/%m/%Y") 
nw.df = merge(df1,df2, by="date") 

Я уверен, что столбец «индекс», который имеет уникальные значения, то может быть использован в функции, такие как ddply, чтобы сконденсировать новый кадр данных, оставив только строки с согласованием «GridCell» значений столбцов для каждое уникальное значение «индекс» (т.е. ddply(nw.df, .(index, …), summarise, …) ). Я просто не могу понять, как это сделать! Любые предложения/помощь будут высоко оценены! Благодарю.

+1

вы пытались объединить как на сегодняшний день и GridCell: 'слияния (DF1, DF2, по = C ("Дата", "GridCell"))'? – Henrik

+0

@ Хенрик: Ха-ха! Так просто. Я не знал, что merge() может использоваться для нескольких переменных. Большое спасибо! (вы можете принять принятый ответ, если хотите?) – Emily

+0

OK! Я отправил свой комментарий в качестве ответа. – Henrik

ответ

1

Вы можете указать как «дата» и «GridCell» в качестве столбцов, используемых для объединения:

merge(df1, df2, by = c("date", "gridcell")) 

Недостаток этого кода в том, что колонка «yr.day» дублируется. Таким образом, вы можете подмножество «df2» включать только столбцы, используемые для объединения, вместе с колонкой (ы) вы хотите добавить (здесь «г»):

merge(x = df1, y = df2[ , c("date", "gridcell", "r")]) 

#   date gridcell index yrday dist ang r 
# 1 04/04/2011  2  3 94 137 163.6 258 
# 2 04/04/2011  5  4 94 116 159.7 246 
# 3 04/04/2011  8  5 94 95 152.5 238 
# 4 13/04/2011  6  1 103 178 148.0 228 
# 5 13/04/2011  9  2 103 158 147.6 242 
# 6 28/03/2011  3  6 87 135 152.2 162 
# 7 28/03/2011  4  7 87 115 121.9 164 

Обратите внимание, что мы не делаем необходимо указать здесь by. Если by не дано, merge находит столбцы, используемые для объединения по by = intersect(names(x), names(y)) (см ?merge), здесь: intersect(names(df1), names(df2[ , c("date", "gridcell", "r")]))

Однако, если вы хотите быть явным (что иногда бывает полезно ...), это даст тот же результат:

merge(x = df1, y = df2[ , c("date", "gridcell", "r")], by = c("date", "gridcell")) 
Смежные вопросы