#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 )