R Соответствие на основе нескольких столбцов

Скажем, у меня есть следующий набор данных, который действует как ключ

  • Значение xy
  • 1 2 10
  • 1 1 20
  • 2 1 30
  • 1 1 20
  • 2 3 200

У меня есть еще данные с большим количеством столбцов, из которых 2 - х и у. Я хочу создать значение столбца, соответствующее ключу, например

  • xy значение и другие столбцы
  • 1 1 20
  • 2 1 30
  • 2 3 300

Я могу использовать только совпадение, чтобы заставить его работать при сопоставлении одного столбца. Как расширить до нескольких совпадений столбцов?

1 ответ

Вы можете использовать merge, как предложил @MrFlick:

df.key <- data.frame(
 x=c(1,1,2,1,2),
 y=c(2,1,1,1,3),
 value=c(10,20,30,20,200))
##
df.add <- data.frame(
 x=c(1,2,2),
 y=c(1,1,3),
 value=c(20,30,300),
 a=rnorm(3),
 b=rpois(3,0))
##
> merge(
 x=df.key,
 y=df.add)
 x y value a b
1 1 1 20 0.9246104 0
2 1 1 20 0.9246104 0
3 2 1 30 0.2685016 0
##
> merge(
 x=df.key,
 y=df.add,
 by=c("x","y"))
 x y value.x value.y a b
1 1 1 20 20 0.9246104 0
2 1 1 20 20 0.9246104 0
3 2 1 30 30 0.2685016 0
4 2 3 200 300 -0.4174230 0

По умолчанию это будет соединяться на пересечении имен столбцов, как в первом примере (x, y, value). Кроме того, вы можете указать, какие столбцы использовать из обоих data.frame используя by=, как во втором примере. Или вы можете получить более конкретную информацию, используя by.x= и/или by.y=. См. " ?merge.

Редактировать:

Проблема состоит в том, что df.key содержит две строки, где x=1, y=1 - TRUE, поэтому строка в df.add с x=1,y=1 должна дублироваться в соединении, чтобы сохранить данные в df.key. Я не уверен, как сделать эту настройку элегантно (например, указав некоторые аргументы для merge), но здесь один подход:

R> merge(
 x=df.key[!duplicated(df.key[,c(1:2)]),],
 y=df.add)
 x y value a b
1 1 1 20 -1.0185211 0
2 2 1 30 2.7507656 0
3 2 3 200 0.3986168 0

licensed under cc by-sa 3.0 with attribution.