Сравнение ответов и решений в R (т. Е. Сравнение двух таблиц) - PullRequest
1 голос
/ 05 октября 2019

У меня есть две таблицы: 1. таблица ответов и 2. таблица решений.

Таблица ответов - это список имен + ответов.

name=c("Jenns","Amy","Jake","Alison","Tommy","Jason","Alex","Vivian")
guess_answer=c("sdgf23894011","lp98ung67543","pwerugji22im","21loop98un89","9580ik8584sf","awe25f6ty788","k0o2jgpo146i","rgyhuj87630l")
answer=data.frame(cbind(name,guess_answer))
> answer
    name guess_answer
1  Jenns sdgf23894011
2    Amy lp98ung67543
3   Jake pwerugji22im
4 Alison 21loop98un89
5  Tommy 9580ik8584sf
6  Jason awe25f6ty788
7   Alex k0o2jgpo146i
8 Vivian rgyhuj87630l

Таблица решений - это спискистрана с соответствующим (цифра + алфавит).

corresponding_number=c("2341rg4524gr","9580ik7584sf","pp0or9rjg7n2","g0o2jgpo146i","lp98ung67543","pwerugji22im","lokibh678901")
country=c("US","UK","CN","AU","JP","KR", "NP")
counry_name=c("United State","United Kingdom","China","Australia","Japan","Korea","North Pole")
solution = cbind(country, corresponding_number,counry_name)
solution = data.frame(solution)
> solution
  country corresponding_number    counry_name
1      US         2341rg4524gr   United State
2      UK         9580ik7584sf United Kingdom
3      CN         pp0or9rjg7n2          China
4      AU         g0o2jgpo146i      Australia
5      JP         lp98ung67543          Japan
6      KR         pwerugji22im          Korea
7      NP         lokibh678901     North Pole

Я хотел бы сравнить таблицу ответов с таблицей решений, в которой, если номер_игры точно такой же или 1 цифра / алфавит отличается, этосчитаю правильным. Затем я хочу создать таблицу с указанием страны, соответствующего номера и названия страны. Например:

> newtable
     name  corresponding_number country_name    
[1,] "xxx" "sdgf23894011"       "xxx"           
[2,] "JP"  "lp98ung67543"       "Japan"         
[3,] "KR"  "pwerugji22im"       "Korea"         
[4,] "xxx" "21loop98un89"       "xxx"           
[5,] "UK"  "9580ik8584sf"       "United Kingdom"
[6,] "xxx" "awe25f6ty788"       "xxx"           
[7,] "AU"  "k0o2jgpo146i"       "Australia"     
[8,] "xxx" "rgyhuj87630l"       "xxx"      
  1. Имя должно быть: либо заменено на «xxx», если ответ неправильный, либо на «сокращение страны», если ответ неправильный.
  2. ответ правильный или неправильный, основан на предположенииАргумент угадывается правильно, если он а) точно такой же, как один из соответствующих номеров, или б) 1 цифра / другой алфавит.
  3. догадка_ответ не изменится, но имя станет «соответствующим_мерой».
  4. Включите третий столбец, в котором указано полное название страны, если угадание_ответа неверно, полное название страны, отвечающей на запрос, будет «ххх». "также.

правка: первое условие.

Ответы [ 2 ]

1 голос
/ 06 октября 2019

В базе R мы можем использовать adist.

#Calculate distance between guess_answer and corresponding_number
mat <- adist(answer$guess_answer, solution$corresponding_number)
#assign default value to result column
answer$country_name <- 'xxx'
#select values with distance of less than or equal to 1
mat1 <- which(mat <= 1, arr.ind = TRUE)
#Order them by row
ord <- order(mat1[, 1])
#Assign values to the column
answer$country_name[mat1[ord, 1]] <- solution$counry_name[mat1[ord, 2]]

answer
#    name guess_answer   country_name
#1  Jenns sdgf23894011            xxx
#2    Amy lp98ung67543          Japan
#3   Jake pwerugji22im          Korea
#4 Alison 21loop98un89            xxx
#5  Tommy 9580ik8584sf United Kingdom
#6  Jason awe25f6ty788            xxx
#7   Alex k0o2jgpo146i      Australia
#8 Vivian rgyhuj87630l            xxx

данные

answer <- data.frame(name,guess_answer, stringsAsFactors = FALSE)
solution <- data.frame(country, corresponding_number,counry_name, 
           stringsAsFactors = FALSE)
1 голос
/ 05 октября 2019

Здесь один вариант - stringdist_left_join, после объединения и mutate до replace NA элементов с 'xxx'

library(fuzzyjoin)
library(dplyr)
stringdist_left_join(answer, solution, 
      by = c("guess_answer" = "corresponding_number"))%>% 
   mutate(corresponding_number = case_when(is.na(corresponding_number)
         ~ guess_answer, TRUE ~ corresponding_number),
          name = case_when(is.na(country) ~ 'xxx', TRUE ~ country), 
          counry_name = replace(counry_name, is.na(counry_name), 'xxx')) %>% 
   select(name, corresponding_number = guess_answer, counry_name)
#  name corresponding_number    counry_name
#1  xxx         sdgf23894011            xxx
#2   JP         lp98ung67543          Japan
#3   KR         pwerugji22im          Korea
#4  xxx         21loop98un89            xxx
#5   UK         9580ik8584sf United Kingdom
#6  xxx         awe25f6ty788            xxx
#7   AU         k0o2jgpo146i      Australia
#8  xxx         rgyhuj87630l            xxx

data

answer <- data.frame(name,guess_answer, stringsAsFactors = FALSE)
solution <- data.frame(country, corresponding_number, 
           counry_name, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...