Dplyr ব্যবহার করে সদৃশ সারিগুলি সরান


128

আমার মতো একটি ডেটা ফ্রেম রয়েছে -

set.seed(123)
df = data.frame(x=sample(0:1,10,replace=T),y=sample(0:1,10,replace=T),z=1:10)
> df
   x y  z
1  0 1  1
2  1 0  2
3  0 1  3
4  1 1  4
5  1 0  5
6  0 1  6
7  1 0  7
8  1 0  8
9  1 0  9
10 0 1 10

আমি প্রথম দুটি কলামের উপর ভিত্তি করে সদৃশ সারিগুলি মুছে ফেলতে চাই। প্রত্যাশিত আউটপুট -

df[!duplicated(df[,1:2]),]
  x y z
1 0 1 1
2 1 0 2
4 1 1 4

আমি বিশেষভাবে dplyrপ্যাকেজ ব্যবহার করে একটি সমাধান খুঁজছি ।

উত্তর:


137

দ্রষ্টব্য : dplyrএখন distinctএই উদ্দেশ্যে ফাংশন রয়েছে ।

নীচে মূল উত্তর:


library(dplyr)
set.seed(123)
df <- data.frame(
  x = sample(0:1, 10, replace = T),
  y = sample(0:1, 10, replace = T),
  z = 1:10
)

একটি পন্থা গোষ্ঠীভুক্ত হবে এবং তারপরে কেবল প্রথম সারিটি রাখা:

df %>% group_by(x, y) %>% filter(row_number(z) == 1)

## Source: local data frame [3 x 3]
## Groups: x, y
## 
##   x y z
## 1 0 1 1
## 2 1 0 2
## 3 1 1 4

(ডিসপ্লায়ার ০.২ এ আপনাকে ডামি zভেরিয়েবলের প্রয়োজন হবে না এবং কেবল লিখতে সক্ষম হবেন row_number() == 1)

আমি এমন একটি slice()ফাংশন যুক্ত করার বিষয়েও ভাবছিলাম যা এর মতো কাজ করবে:

df %>% group_by(x, y) %>% slice(from = 1, to = 1)

অথবা এর পরিবর্তনের ফলে unique()আপনাকে কোন ভেরিয়েবলগুলি ব্যবহার করতে হবে তা নির্বাচন করতে দেয়:

df %>% unique(x, y)

4
@ ডটকমেন ততক্ষণ পর্যন্ত কেবল মাত্র ব্যবহার করতে পারতdf %>% group_by(x, y) %>% do(head(.,1))
হোলার ব্র্যান্ডেল

16
@ মাহবুবুলমজুমদার যা কাজ করবে তবে বেশ ধীর। dplyr 0.3 থাকবেdistinct()
হ্যাডলি

3
@ হ্যাডলি আমি অনন্য () এবং স্বতন্ত্র () ফাংশন পছন্দ করি তবে যাইহোক, তারা সবাই ডেটা ফ্রেম থেকে ২ য় নকলকে সরিয়ে দেয়। আমি যদি ডুপ্লিকেট মানটির সমস্ত 1 ম মুখোমুখি মুছে ফেলতে চাই? এটি কিভাবে করা যেতে পারে? কোন সাহায্যের জন্য ধন্যবাদ!
ফ্লাইংডাচ

2
@ এমভিজেডবি - আপনি কেবল (ডেস্ক ()) ব্যবস্থা না করে আলাদা ব্যবহার করবেন না?
উডস্টক

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

191

এখানে একটি সমাধান ব্যবহার করে dplyr >= 0.5

library(dplyr)
set.seed(123)
df <- data.frame(
  x = sample(0:1, 10, replace = T),
  y = sample(0:1, 10, replace = T),
  z = 1:10
)

> df %>% distinct(x, y, .keep_all = TRUE)
    x y z
  1 0 1 1
  2 1 0 2
  3 1 1 4

3
এই সমাধানটি হ্যাডলির সরবরাহিত সমাধানের চেয়ে অনেক দ্রুত (আমার ক্ষেত্রে 10 বার) উপস্থিত বলে মনে হচ্ছে।
ক্যালিমো

101
প্রযুক্তিগতভাবে এটি হ্যাডলির দ্বারা সরবরাহিত একটি সমাধান :-)
টাইলার রিঙ্কার

27

সম্পূর্ণতার জন্য, নিম্নলিখিতগুলিও কাজ করে:

df %>% group_by(x) %>% filter (! duplicated(y))

তবে আমি সমাধানটি ব্যবহার করে পছন্দ করি distinctএবং আমার সন্দেহ হয় এটি খুব দ্রুত it's


7

বেশিরভাগ সময়, সেরা সমাধানটি distinct()dplyr থেকে ব্যবহার করা হয়, যেমন ইতিমধ্যে পরামর্শ দেওয়া হয়েছে।

যাইহোক, এখানে আরেকটি পদ্ধতি যা slice()dplyr থেকে ফাংশনটি ব্যবহার করে ।

# Generate fake data for the example
  library(dplyr)
  set.seed(123)
  df <- data.frame(
    x = sample(0:1, 10, replace = T),
    y = sample(0:1, 10, replace = T),
    z = 1:10
  )

# In each group of rows formed by combinations of x and y
# retain only the first row

    df %>%
      group_by(x, y) %>%
      slice(1)

distinct()ফাংশন ব্যবহার থেকে পার্থক্য

এই সমাধানটির সুবিধাটি হ'ল এটি স্পষ্ট করে তোলে যে সারিগুলি মূল ডেটাফ্রেম থেকে ধরে রাখা হয় এবং এটি arrange()ফাংশনের সাথে সুন্দরভাবে জুড়ি দিতে পারে।

ধরা যাক আপনার গ্রাহক বিক্রয় ডেটা ছিল এবং আপনি গ্রাহক প্রতি একটি রেকর্ড ধরে রাখতে চেয়েছিলেন এবং আপনি সর্বশেষ ক্রয় থেকে সেই রেকর্ডটিই চান। তাহলে আপনি লিখতে পারেন:

customer_purchase_data %>%
   arrange(desc(Purchase_Date)) %>%
   group_by(Customer_ID) %>%
   slice(1)

3

হ্রাসকৃত ডেটা-সেটের জন্য আর-এ কলামগুলি নির্বাচন করার সময় আপনি প্রায়শই নকল দিয়ে শেষ করতে পারেন।

এই দুটি লাইন একই ফলাফল দেয়। প্রতিটি কেবলমাত্র দুটি নির্বাচিত কলাম সহ একটি অনন্য ডেটা-সেট আউটপুট দেয়:

distinct(mtcars, cyl, hp);

summarise(group_by(mtcars, cyl, hp));

1

ডুপ্লিকেটযুক্ত সারিগুলি যদি আপনি সন্ধান করতে চান তবে আপনি এগুলি find_duplicatesথেকে ব্যবহার করতে পারেন hablar:

library(dplyr)
library(hablar)

df <- tibble(a = c(1, 2, 2, 4),
             b = c(5, 2, 2, 8))

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