как сравнить два фрейма данных с разными значениями допуска для разных столбцов?

#r #compare #multiple-columns

#r #Сравнить #несколько столбцов

Вопрос:

Есть два фрейма данных, такие как:

первый фрейм данных:

  d1       d2      d3
694   1.809509    74.9223
695   1.809510    73.2323
696   1.809511    23.7266
2243  1.465000    64.7542
2244  1.465001    85.7634
2651  1.143814    98.6344
2652  1.143813    46.9485
  

второй фрейм данных:

   d1       d2     d3
694    1.809509   73.5324
2243   1.465000   72.7854
2652   1.143813   25.4734
2784   1.162545   61.3456
2924   1.989442   88.9845
2846   1.929882   96.3874
  

Я хочу сравнить эти два фрейма данных. Я попробовал использовать один уровень допуска в all.equal() методе для обоих фреймов. но требование заключается в том, что разные столбцы имеют разное значение допуска. например, допуск d1 равен 3 или 40% , значение допуска для d3 равно 2 или 30% , а для d2 ‘1’ или 23% . При сравнении он должен проходить под этими значениями допуска.

Помогите мне в решении этой проблемы. Каждое усилие заметно.

Комментарии:

1. Не уверен, что я понял, что вам нужно, но почему бы не объединить фреймы данных?

2. Пожалуйста, опубликуйте ожидаемый результат. Что значит допуск равен 3 ?

3. @DJV это не связано со слиянием фреймов данных. он примерно проходит тест сравнения при некотором допуске, что означает, что если в столбце первой строки d3 есть значение 74.9223 и 73.5324 в обоих фреймах, значение допуска для этого d3 равно 2 . таким образом, сравнение должно указывать, что эти значения равны, если они принадлежат [74.9223 -2, 74.9223 2] или [74.9223 - 30%, 74.9223 30%] (в качестве базового фрейма данных взят 1-й фрейм данных, и значения допуска должны быть применены к 1-му фрейму данных).

4. @Sotos ожидаемый результат, как показано ниже, когда значение допуска, скажем, d1 , d2 d3 равно 1% , 1 и 3 : d1 значение 1st фрейма равно 694 , а со значением допуска 1% его диапазон равен [687.06, 700.94] , и если d1 у 2nd фрейма есть значения между диапазоном [687.06, 700.94] , то он должен возвращать значения, равные обоим фреймам, и этот ожидаемый результат должен применяться ко всем столбцам относительно их значения допуска. в конце, если все идет хорошо в соответствии со значениями допуска, должно быть указано, что оба фрейма равны.

Ответ №1:

Если я правильно понимаю, вы ищете идентичную функцию. Идентичный тест, если два объекта одинаковы.

 x <- mtcars
y <- mtcars

identical( x, y )

y[ 3, 5] <- 300

identical( x, y )
  

Вы можете выполнить цикл идентичной функции для каждого столбца.

 for( i in names( x ) ){
    print( identical( x[,i] , y[,i]) )
}
  

Кроме того, в этом случае, когда строки и столбцы находятся в одинаковом порядке, вы можете вычислить разницу

 z <- x - y
sapply( z , summary)
  

Комментарии:

1. ваше решение звучит неплохо, но это я уже реализовал. Теперь я хочу провести сравнение со значениями допуска, как я упоминал выше.

Ответ №2:

Эта функция проверяет, отличается ли столбец с тем же именем или в той же позиции больше или меньше указанного порогового значения.

 x <- mtcars
y <- mtcars

y[ 3, 5] <- 300
y[ 2, 5] <- 4


y[ 3, 6] <- 2.8
y[ 2, 6] <- 4



test <-function( Z , TOL ){ as.numeric( 
    x[ , Z] > ( y[ , Z] * (1 TOL)) | 
    x[ , Z] < ( y[ , Z] * (1-TOL)) 
    )
    }


#compare the whole dataset at 20%
do.call( cbind, lapply( names( x )  , test , .2 ) )

# compare a specific column at 20 and 40 % difference
x$morethan20 <-  test( "drat" , .2 )
x$morethan40 <-  test( "wt" , .4 )