"ছোট সাবস্ক্রিপ্ট সহ উপাদানগুলি" সহ সমস্ত নকল সারি সন্ধান করা হচ্ছে


111

আর এর duplicatedভেক্টরকে দেখায় যে ভেক্টর এবং ডেটা ফ্রেমের প্রতিটি উপাদান একটি ছোট সাবস্ক্রিপ্ট সহ কোনও উপাদানের নকল কিনা তা দেখায়। সুতরাং যদি 5-সারির ডেটা ফ্রেমের 3, 4 এবং 5 সারি একই হয় তবে duplicatedআমাকে ভেক্টর দেবেন

FALSE, FALSE, FALSE, TRUE, TRUE

তবে এই ক্ষেত্রে আমি আসলে পেতে চাই

FALSE, FALSE, TRUE, TRUE, TRUE

এটি হ'ল আমি জানতে চাই যে একটি বৃহত্তর সাবস্ক্রিপ্টের সাথেও একটি সারি একটি সারি দ্বারা নকল করা হয়েছে কিনা ।

উত্তর:


128

duplicatedএকটি fromLastযুক্তি আছে। "উদাহরণ" বিভাগটি ?duplicatedআপনাকে এটি কীভাবে ব্যবহার করতে হয় তা দেখায়। duplicatedএকবার দু'বার কল করুন , একবারে একবারে সাথে একবার fromLast=FALSEএবং একবারে fromLast=TRUEসারিগুলি নিয়ে যান TRUE


কিছু দেরী সম্পাদনা: আপনি পুনরুত্পাদনযোগ্য উদাহরণটি সরবরাহ করেন নি, তাই এখানে @jbaums দ্বারা দয়া করে অবদানের একটি চিত্র রয়েছে

vec <- c("a", "b", "c","c","c") 
vec[duplicated(vec) | duplicated(vec, fromLast=TRUE)]
## [1] "c" "c" "c"

সম্পাদনা করুন: এবং ডেটা ফ্রেমের ক্ষেত্রে উদাহরণ:

df <- data.frame(rbind(c("a","a"),c("b","b"),c("c","c"),c("c","c")))
df[duplicated(df) | duplicated(df, fromLast=TRUE), ]
##   X1 X2
## 3  c  c
## 4  c  c

3
চেপে ধরুন, আমি কেবল একটি পরীক্ষা x <- c(1:9, 7:10, 5:22); y <- c(letters, letters[1:5]); test <- data.frame(x, y); test[duplicated(test$x) | duplicated(test$x, fromLast=TRUE), ]চালিয়েছি এবং আমার ভুল ছিলাম: 7, ৮ এবং ৯ এর তিনটি অনুলিপি ফিরে পেয়েছি কেন এটি কাজ করে?
JoeM05

1
কারণ মাঝামাঝিগুলি আপনি প্রান্ত থেকে বা সামনের দিক থেকে শুরু না করেই বন্দী হন। উদাহরণস্বরূপ, duplicated(c(1,1,1))বনাম duplicated(c(1,1,1,), fromLast = TRUE)দেয় c(FALSE,TRUE,TRUE)এবং c(TRUE,TRUE,FALSE)। মাঝারি মান TRUEউভয় ক্ষেত্রে। |উভয় ভেক্টর গ্রহণ করে c(TRUE,TRUE,TRUE)
ব্র্যান্ডন

34

আপনাকে duplicatedমানগুলির সেটটি একত্রিত করতে হবে , প্রয়োগ করতে হবে uniqueএবং এর সাথে পরীক্ষা করতে হবে %in%। সর্বদা হিসাবে, একটি নমুনা সমস্যা এই প্রক্রিয়াটিকে জীবিত করে তুলবে।

> vec <- c("a", "b", "c","c","c")
> vec[ duplicated(vec)]
[1] "c" "c"
> unique(vec[ duplicated(vec)])
[1] "c"
>  vec %in% unique(vec[ duplicated(vec)]) 
[1] FALSE FALSE  TRUE  TRUE  TRUE

একমত। এমনকি প্রক্রিয়াটি ধীর করতে পারে তবে এটি খুব কমিয়ে আনার সম্ভাবনা নেই।
আইআরটিএফএম

কিছুটা সত্য. ওপি কোনও ডেটা ফ্রেমে "কখনও সদৃশ" সারিগুলির পরীক্ষা করার জন্য কোনও ডেটা উদাহরণ দেয়নি। আমি মনে করি আমার ব্যবহারের পরামর্শ duplicated, uniqueএবং %in%খুব সহজেই একটি ডেটাফ্রেমে সাধারণীকরণ করা যেতে পারে যদি pasteপ্রতিটি সারিতে প্রথমে কোনও অস্বাভাবিক বিভাজক চরিত্র থাকে। (গৃহীত উত্তরটি আরও ভাল))
আইআরটিএফএম

3

আমারও একই প্রশ্ন ছিল এবং আমি যদি ভুল না করি তবে এটিও একটি উত্তর।

vec[col %in% vec[duplicated(vec$col),]$col]

ডুনো কোনটি দ্রুত, যদিও, বর্তমানে আমি যে ডেটাসেটটি ব্যবহার করছি তা পরীক্ষার জন্য যথেষ্ট বড় নয় যা উল্লেখযোগ্য সময়ের ব্যবধান তৈরি করে।


1
এই উত্তরটি vecপারমাণবিক ভেক্টর এবং ডেটাফ্রেম হিসাবে ব্যবহার করবে বলে মনে হয় । আমি সন্দেহ করি যে প্রকৃত ডেটাফ্রেমে এটি ব্যর্থ হবে।
আইআরটিএফএম

3

একটি dataframe মধ্যে সদৃশ সারি সঙ্গে প্রাপ্ত করা যায়নি dplyrকরে

df = bind_rows(iris, head(iris, 20)) # build some test data
df %>% group_by_all() %>% filter(n()>1) %>% ungroup()

বাদ দেওয়ার জন্য নির্দিষ্ট কলামগুলি group_by_at(vars(-var1, -var2))ডেটা গ্রুপ করার পরিবর্তে ব্যবহার করা যেতে পারে।

যদি সারি সূচকগুলি এবং কেবলমাত্র ডেটা প্রয়োজন হয় না, আপনি এগুলি প্রথম হিসাবে যুক্ত করতে পারেন:

df %>% add_rownames %>% group_by_at(vars(-rowname)) %>% filter(n()>1) %>% pull(rowname)

1
ভাল ব্যবহার n()। ফলস্বরূপ ডেটাফ্রেমকে গ্রুপমুক্ত করতে ভুলবেন না।
Qwr

@ কিউইউআর আমি ফলাফলটি গোষ্ঠীভুক্ত করার জন্য উত্তরটি সামঞ্জস্য করেছি
হোলার ব্র্যান্ডেল

2

এখানে একটি ফাংশন হিসাবে @ জোশুয়া উলরিচের সমাধান। এই ফর্ম্যাটটি আপনাকে একই কোডটিতে এই কোডটি ব্যবহার করতে দেয় যা আপনি নকল () ব্যবহার করবেন:

allDuplicated <- function(vec){
  front <- duplicated(vec)
  back <- duplicated(vec, fromLast = TRUE)
  all_dup <- front + back > 0
  return(all_dup)
}

একই উদাহরণ ব্যবহার করে:

vec <- c("a", "b", "c","c","c") 
allDuplicated(vec) 
[1] FALSE FALSE  TRUE  TRUE  TRUE

0

যদি আপনি আগ্রহী হন যে নির্দিষ্ট কলামগুলির জন্য কোন সারিগুলি নকল করা হয়েছে আপনি প্লাইর পদ্ধতির ব্যবহার করতে পারেন :

ddply(df, .(col1, col2), function(df) if(nrow(df) > 1) df else c())

Dplyr এর সাথে একটি গণনা ভেরিয়েবল যুক্ত করা :

df %>% add_count(col1, col2) %>% filter(n > 1)  # data frame
df %>% add_count(col1, col2) %>% select(n) > 1  # logical vector

সদৃশ সারিগুলির জন্য (সমস্ত কলাম বিবেচনা করে):

df %>% group_by_all %>% add_tally %>% ungroup %>% filter(n > 1)
df %>% group_by_all %>% add_tally %>% ungroup %>% select(n) > 1

এই পদ্ধতির সুবিধা হ'ল আপনি কাট অফ হিসাবে কতগুলি সদৃশ নির্দিষ্ট করতে পারবেন।


0

আমারও একই সমস্যা ছিল তবে নির্দিষ্ট কলামগুলিতে মান দ্বারা ডুপ্লিকেট করা সারিগুলি সনাক্ত করা দরকার। আমি নিম্নলিখিত dplyr সমাধান নিয়ে এসেছি :

df <- df %>% 
  group_by(Column1, Column2, Column3) %>% 
  mutate(Duplicated = case_when(length(Column1)>1 ~ "Yes",
                            TRUE ~ "No")) %>%
  ungroup()

কোডটি নির্দিষ্ট কলামগুলিতে সারিগুলিকে ভাগ করে দেয়। কোনও গোষ্ঠীর দৈর্ঘ্য যদি 1 এর বেশি হয় তবে কোডটি গ্রুপের সমস্ত সারিটি সদৃশ হিসাবে চিহ্নিত করেছে। এটি হয়ে গেলে আপনি Duplicatedফিল্টারিং ইত্যাদির জন্য কলাম ব্যবহার করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.