#r
Вопрос:
В моем фрейме данных у меня более 1000 столбцов, и я проверяю повторяющиеся записи в фрейме данных.
таким образом, на самом деле у меня есть столбцы с ID1 — ID 1000, и я хочу проверить, есть ли какая-либо повторяющаяся запись в любой строке с ID1-ID100, затем я хочу изменить новый столбец с текстом «дубликат записи» и хочу добавить этот столбец перед столбцом «Имя». я пытаюсь создать функцию для этого.
Ниже кадра данных приведен пример кадра данных
df <- data.frame(ID =c("DEV2962","KTN2252","ANA2719","ITI2624","DEV2698","HRT2921",NA,"KTN2624","ANA2548","ITI2535","DEV2732","HRT2837","ERV2951","KTN2542","ANA2813","ITI2210"),
city=c("DEL","mum","DEL","MUM","DEL","del","MUM","DEL","del","MUM","mum","mum","mum","mum","DEL","DEL"),
Name= c("dev,akash","singh,Ajay","abbas,salman","lal,ram","singh,nkunj","garg,prabal","ali,sanu","singh,kunal","tomar,lakhan","thakur,praveen","ali,sarman","khan,zuber","singh,giriraj","sharma,lokesh","pawar,pooja","sharma,nikita"),
ID2 = c("A0011","A0011","A0011","A0011","A0011","A0012","AB702","AB328","AC728","AC314","AC742","AC919","AC062","AD712","AD021","AD920"),
ID3 = c("A0012","A0012","A0012","A0012","A0012","A0013","AB712","AB712","AB702","AB328","AC314","AC728","AB702","AB712","AC742","AC919"),
ID4 = c(NA,"A0013","A0013","A0013","AB982","AB982",NA,"AB982","A0013","A0012","A0012","A0012","A0012",NA,"A0013","A0012"),
ID5 =c(NA,"A0012","AB012","AB012",NA,"AB702",NA,"A0013",NA,"A0011","A0011",NA,"A0011",NA,NA,NA),
ID6 = c(NA,NA,NA,"AB982",NA,NA,NA,"A0012",NA,NA,NA,NA,NA,NA,NA,NA),
ID7 = c(NA,NA,NA,NA,NA,NA,NA,"A0011",NA,NA,NA,NA,NA,NA,NA,NA),
ID8 =c(NA,NA,NA,NA,NA,NA,NA,"AB982",NA,NA,NA,NA,NA,NA,NA,NA))
hasDups <- function(df){
checkDup <- function(x){
ifelse(max(table(x)) > 1, "duplicate available", "")
}
df$hasDup <- apply(df, 1, checkDup)
col_nams <- c(c("ID", "city", "Name", "hasDup"),
setdiff(names(df), c("ID", "city", "Name", "hasDup")))
df <- df[, col_nams]
return(df)
}
hasDups(df)
Ответ №1:
Вы можете выбрать определенные столбцы с grep
помощью .
hasDups <- function(df){
cols <- grep('ID\d ', names(df), value= TRUE)
checkDup <- function(x){
if(max(table(x)) > 1) "duplicate entry" else ""
}
df$hasDup <- apply(df[cols], 1, checkDup)
col_nams <- c(setdiff(names(df), c("hasDup", "Name", cols)), "hasDup", "Name", cols)
df <- df[, col_nams]
return(df)
}
hasDups(df)
# ID city hasDup Name ID2 ID3 ID4 ID5 ID6 ID7 ID8
#1 DEV2962 DEL dev,akash A0011 A0012 <NA> <NA> <NA> <NA> <NA>
#2 KTN2252 mum duplicate entry singh,Ajay A0011 A0012 A0013 A0012 <NA> <NA> <NA>
#3 ANA2719 DEL abbas,salman A0011 A0012 A0013 AB012 <NA> <NA> <NA>
#4 ITI2624 MUM lal,ram A0011 A0012 A0013 AB012 AB982 <NA> <NA>
#5 DEV2698 DEL singh,nkunj A0011 A0012 AB982 <NA> <NA> <NA> <NA>
#6 HRT2921 del garg,prabal A0012 A0013 AB982 AB702 <NA> <NA> <NA>
#7 <NA> MUM ali,sanu AB702 AB712 <NA> <NA> <NA> <NA> <NA>
#8 KTN2624 DEL duplicate entry singh,kunal AB328 AB712 AB982 A0013 A0012 A0011 AB982
#9 ANA2548 del tomar,lakhan AC728 AB702 A0013 <NA> <NA> <NA> <NA>
#10 ITI2535 MUM thakur,praveen AC314 AB328 A0012 A0011 <NA> <NA> <NA>
#11 DEV2732 mum ali,sarman AC742 AC314 A0012 A0011 <NA> <NA> <NA>
#12 HRT2837 mum khan,zuber AC919 AC728 A0012 <NA> <NA> <NA> <NA>
#13 ERV2951 mum singh,giriraj AC062 AB702 A0012 A0011 <NA> <NA> <NA>
#14 KTN2542 mum sharma,lokesh AD712 AB712 <NA> <NA> <NA> <NA> <NA>
#15 ANA2813 DEL pawar,pooja AD021 AC742 A0013 <NA> <NA> <NA> <NA>
#16 ITI2210 DEL sharma,nikita AD920 AC919 A0012 <NA> <NA> <NA> <NA>
Комментарии:
1. это нормально, у нас есть какой-либо вариант, при котором мне не нужно определять имена столбцов здесь . например, я могу сохранить все («идентификатор»,»город»,….) слева, а затем «hasdup» и «имя» справа со всеми столбцами от «ID1» до ID1000
2. Конечно, смотрите обновленный ответ.
Ответ №2:
Вы рассматривали возможность использования duplicated()
встроенного модуля R ?
Вы можете использовать его во всем наборе данных (в этом случае строка считается дубликатом только в том случае, если перед ней есть другая строка с одинаковым значением во всех столбцах) или по столбцам. Он возвращает логическое значение со значением TRUE, когда это дубликат, и FALSE, когда это не так.
Я предположу, что вы хотите проверить весь набор данных, чтобы сделать что-то настолько простое, как:
df$isduplicated = ifelse(duplicated(df),"Duplicated entry","")
Создаст нужный вам столбец. Вы можете упорядочить столбцы data.frame по своему усмотрению.
Комментарии:
1. Я хочу проверить каждую строку из столбца ID1-ID1000, поэтому, например, во второй строке A0012 отображается дубликат, поэтому он отображается как дубликат. Я пробовал дублировать, но здесь это не работает.
2. Кажется, что любое упрощение может помочь, используя его по строкам, но я не могу написать забавный ответ здесь.