Как проверить два файла в R

#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