#r
#r
Вопрос:
У меня есть два файла, и я хочу убедиться, что эти два файла совпадают.
Файл 1:
df1<-read.table (text=" class type colour gender
12 1 yellow F
11 1 green M
14 2 red M
18 2 red F
16 1 red F
", header=TRUE)
Файл 2:
df2<-read.table (text=" class type colour gender
12 1 yellow F
11 2 gree M
14 2 red N
18 2 red F
18 1 red F
", header=TRUE)
Как мы можем видеть в df2, в столбцах четыре ошибки. Например, в df2 класс должен читать 16, как в df1, класс равен 16 (последняя строка), а не 18. Если значения в df1 и df2 не равны, я хочу получить FALSE, а затем посмотреть количество ошибок. результат таков: и ошибка = 4. У меня почти 100 столбцов, и поэтому они представляют собой лишь небольшую выборку данных
out<-read.table (text=" class type colour gender
12 1 yellow F
11 FALSE FALSE M
14 2 red FALSE
18 2 red F
FALSE 1 red F
", header=TRUE)
Error =4
Комментарии:
1. Не могли бы вы вернуть длину
df1 %ni% df2
, где'%!in%' <- function(x,y)!('%in%'(x,y))
Ответ №1:
Изменение ответа Даниэля
chck <- mapply(function(x,y){
x[x != y] <- 'FALSE'
x
}, df1, df2)
chck <- data.frame(chck)
#-------
class type colour gender
1 12 1 yellow F
2 11 FALSE FALSE M
3 14 2 red FALSE
4 18 2 red F
5 FALSE 1 red F
sum(!chck)
# 4
Ответ №2:
Вы можете перебирать столбцы mapply
и генерировать логическую матрицу. Вам просто нужно убедиться, что ваши фреймы данных не содержат каких-либо факторов:
Создать данные:
df1<-read.table (text=" class type colour gender
12 1 yellow F
11 1 green M
14 2 red M
18 2 red F
16 1 red F
", header=TRUE, as.is = TRUE)
df2<-read.table (text=" class type colour gender
12 1 yellow F
11 2 gree M
14 2 red N
18 2 red F
18 1 red F
", header=TRUE, as.is = TRUE)
Сравнить фреймы данных:
match <- mapply(`==`, df1, df2)
table(match)
# FALSE TRUE
# 4 16
Ответ №3:
Вы можете попробовать
> ifelse(df1 == df2, as.matrix(df1), FALSE)
class type colour gender
[1,] "12" "1" "yellow" "F"
[2,] "11" "FALSE" "FALSE" "M"
[3,] "14" "2" "red" "FALSE"
[4,] "18" "2" "red" "F"
[5,] "FALSE" "1" "red" "F"
Если вы хотите подсчитать, сколько ошибок
> table(df1 == df2)
FALSE TRUE
4 16
или
> sum(df1 != df2)
[1] 4
Ответ №4:
# install.packages("diffr")
library(diffr)
diffr("file1.R", "file2.R")
Это даст вам разницу между файлом:
library(tools)
Rdiff("file1.R","file2.R", Log = T)
#For number of errors:
all.equal(readLines("file1.R"), readLines("file2.R"))
Это все, что я могу предложить прямо сейчас.
1c1
< df1<-read.table (text=" class type colour gender
---
> df2<-read.table (text=" class type colour gender
3c3
< 11 1 green M
---
> 11 2 gree M
4c4
< 14 2 red M
---
> 14 2 red N
6c6
< 16 1 red F
---
> 18 1 red F
$status
[1] 1
$out
[1] "1c1n< df1<-read.table (text=" class type colour gendern---n> df2<-read.table (text=" class type colour gender"
[2] "3c3n< 11 1 green Mn---n> 11 2 gree M"
[3] "4c4n< 14 2 red Mn---n> 14 2 red N"
[4] "6c6n< 16 1 red Fn---n> 18 1 red F"
Комментарии:
1. Спасибо, извините, это не отражает мой результат.
2.
Rdiff()
функция немного приближается к запрошенному вами результату.
Ответ №5:
Простое решение с R-базой:
text1 <- unname(unlist(lapply(df1, as.character)))
text2 <- unname(unlist(lapply(df2, as.character)))
# number of differences
sum(text1 != text2)
Вы можете создать функцию:
n_diff <- function(a, b){
a <- unname(unlist(lapply(a, as.character)))
b <- unname(unlist(lapply(b, as.character)))
n <- sum(a != b)
print(paste0("Error = ", n))
ifelse(n==0, TRUE, FALSE)
}
и вывод:
> n_diff(df1, df2)
[1] "Error = 4"
[1] FALSE
> x<-n_diff(df1, df2)
[1] "Error = 4"
> x
[1] FALSE