সদৃশ সারিগুলি সরান


152

আমি একটি CSVফাইল একটি আর তথ্য.ফ্রেমে পড়েছি । সারিগুলির কয়েকটিতে একটি কলামে একই উপাদান রয়েছে। আমি সেই কলামে সদৃশ সারিগুলি সরাতে চাই। উদাহরণ স্বরূপ:

platform_external_dbus          202           16                     google        1
platform_external_dbus          202           16         space-ghost.verbum        1
platform_external_dbus          202           16                  localhost        1
platform_external_dbus          202           16          users.sourceforge        8
platform_external_dbus          202           16                    hughsie        1

প্রথম কলামে অন্যদের একই ডেটা থাকায় আমি এই সারিগুলির মধ্যে একটিতে চাই।


3
তুমি কোনটি চাও? শুধু প্রথম? অন্য কথায়: আপনি রাখতে চান googleবা localhostবা hughsie?
অ্যান্থনি দামিকো

আমার পরিসংখ্যানগত বিশ্লেষণের এই অংশটির জন্য এটি কোনও ব্যাপার নয়। আমি কেবলমাত্র প্রকল্পের শিরোনাম (প্রথম কলাম), বাগের সংখ্যা (দ্বিতীয় কলাম) এবং প্রকল্পে সংস্থার সংখ্যা (তৃতীয় কলাম) সম্পর্কিত করার চেষ্টা করছি।
ব্যবহারকারী 1897691

3
শীতল। অপ্রয়োজনীয় কলামগুলি ফেলে দিন এবং ব্যবহার করবেন? অনন্য
অ্যান্থনি দামিকো

উত্তর:


186

আপনার প্রয়োজনীয় কলামগুলিতে কেবল আপনার ডেটা ফ্রেমকে আলাদা করুন, তারপরে অনন্য ফাংশনটি ব্যবহার করুন: ডি

# in the above example, you only need the first three columns
deduped.data <- unique( yourdata[ , 1:3 ] )
# the fourth column no longer 'distinguishes' them, 
# so they're duplicates and thrown out.

1
দেখে মনে হচ্ছে এটি নিখুঁতভাবে কাজ করবে। আপনি কি দয়া করে আমাকে সেই কোডটির [,1:3]অংশের সাথে কী ঘটছে তা ব্যাখ্যা করতে পারেন ? আমি আরে নতুন তাই আমি কেবল যা অনুমান করতে পারি তা জিজ্ঞাসা করছি একটি সুস্পষ্ট প্রশ্ন।
ব্যবহারকারী 1897691

6
@ ব্যবহারকারী 1897691 এটিকে তখন সঠিক হিসাবে চিহ্নিত করুন;) এটি দেখুন এবং যদি আপনি এটি পছন্দ করেন তবে twotorials.com দেখুন
অ্যান্টনি ড্যামিকো

3
মনে রাখবেন যে এটি প্রথম তিনটি বাদে সমস্ত কলাম সরিয়ে ফেলবে।
গিলাইমএল

186

সদৃশ সারি অপসারণের জন্য সাধারণ উত্তর খুঁজতে এখানে আসা ব্যক্তিদের জন্য, ব্যবহার করুন !duplicated():

a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)

duplicated(df)
[1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE

> df[duplicated(df), ]
  a b
2 A 1
6 B 1
8 C 2

> df[!duplicated(df), ]
  a b
1 A 1
3 A 2
4 B 4
5 B 1
7 C 2

থেকে উত্তর: আর ডেটা ফ্রেম থেকে সদৃশ সারিগুলি সরানো হচ্ছে


আমি একটি নতুন ভারিবেল তৈরি করতে চাই যে পতাকাগুলি যদি কোনও নির্দিষ্ট ভেরিয়েবলের ডুপ্লিকেট থাকে যেমন ডিএফ-ডুপ্লিকেট <- ifelse (কলামে এই সারি মান a == কলামের পূর্ববর্তী সারির মান 1, 1, 0)
জ্যাকব

@jacob এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/12495345/...
dpel

2
এটি প্রথম প্রদর্শিত মান রাখে এবং বাকী নকলগুলি সরিয়ে দেয়, তাইনা? অথবা এটি এলোমেলোভাবে মানগুলি সরিয়ে দেয়?
নিউজ_আইস_লেকশন_বায়াস

@ হালকাবেগম্মা হ্যাঁ, এটি প্রথম প্রদর্শিত মান রাখে
মেহেদি নেলেন

2
আপনি যদি নির্দিষ্ট কলামগুলিতে কেবল নকল করতে আগ্রহী হন তবে কলস 1 এবং 2 বলুন, আমরা ব্যবহার করতে পারিdf[!duplicated(df[, 1:2])]
qwr

82

ফাংশন distinct()মধ্যে dplyrপ্যাকেজ সঞ্চালিত হয় / ভেরিয়েবল (এই প্রশ্নে হিসাবে) নির্দিষ্ট কলাম থেকে বা সব কলাম / ভেরিয়েবল বিবেচনা করা ডুপ্লিকেট অপসারণ নির্বিচারে। dplyrএর অংশ tidyverse

তথ্য এবং প্যাকেজ

library(dplyr)
dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))

নির্দিষ্ট কলামে সদৃশ সারিগুলি সরান (উদাঃ, কলাম a)

মনে রাখবেন যে .keep_all = TRUEসমস্ত কলামগুলি ধরে রাখে, অন্যথায় কেবল কলামটিই ধরে aরাখতে পারে।

distinct(dat, a, .keep_all = TRUE)

  a b
1 1 A
2 2 B

অন্যান্য সারিগুলির সম্পূর্ণ সদৃশ এমন সারিগুলি সরান:

distinct(dat)

  a b
1 1 A
2 2 B
3 1 C
4 2 D

গ্রেট উত্তর, উপায় দ্বারা, .keep_allকিনা সব কলাম রাখা, না সঙ্গে মিশ্রিত করা হয় keepমধ্যে pandas
জেসন গোল

28

data.tableপ্যাকেজ এছাড়াও আছে uniqueএবং duplicatedএটা পদ্ধতি কিছু অতিরিক্ত বৈশিষ্ট্য সঙ্গে মালিক হচ্ছে।

উভয় unique.data.tableএবং duplicated.data.tableপদ্ধতি একটি অতিরিক্ত আছে byআমার যুক্তি, যা আপনি একটি পাস করতে পারবেন characterবা integerযথাক্রমে কলাম নামে বা তাদের অবস্থানের ভেক্টর

library(data.table)
DT <- data.table(id = c(1,1,1,2,2,2),
                 val = c(10,20,30,10,20,30))

unique(DT, by = "id")
#    id val
# 1:  1  10
# 2:  2  10

duplicated(DT, by = "id")
# [1] FALSE  TRUE  TRUE FALSE  TRUE  TRUE

এই পদ্ধতির আরেকটি গুরুত্বপূর্ণ বৈশিষ্ট্য হ'ল বৃহত্তর ডেটা সেটের জন্য বিশাল পারফরম্যান্স লাভ

library(microbenchmark)
library(data.table)
set.seed(123)
DF <- as.data.frame(matrix(sample(1e8, 1e5, replace = TRUE), ncol = 10))
DT <- copy(DF)
setDT(DT)

microbenchmark(unique(DF), unique(DT))
# Unit: microseconds
#       expr       min         lq      mean    median        uq       max neval cld
# unique(DF) 44708.230 48981.8445 53062.536 51573.276 52844.591 107032.18   100   b
# unique(DT)   746.855   776.6145  2201.657   864.932   919.489  55986.88   100  a 


microbenchmark(duplicated(DF), duplicated(DT))
# Unit: microseconds
#           expr       min         lq       mean     median        uq        max neval cld
# duplicated(DF) 43786.662 44418.8005 46684.0602 44925.0230 46802.398 109550.170   100   b
# duplicated(DT)   551.982   558.2215   851.0246   639.9795   663.658   5805.243   100  a 

7

আপনি dplyrএর distinct()ফাংশন ব্যবহার করতে পারেন ! এটি বিকল্প বিকল্পগুলির চেয়ে বেশি দক্ষ হতে থাকে, বিশেষত যদি আপনার পর্যবেক্ষণের পরিমাণ অনেক বেশি থাকে।

distinct_data <- dplyr::distinct(yourdata)

1
এটি স্যাম ফিরকের উত্তর হিসাবে একই উত্তর, তবে কম বিশদ সহ।
Qwr

6

সাধারণ উত্তর উদাহরণ হিসাবে হতে পারে:

df <-  data.frame(rbind(c(2,9,6),c(4,6,7),c(4,6,7),c(4,6,7),c(2,9,6))))



new_df <- df[-which(duplicated(df)), ]

আউটপুট:

      X1 X2 X3
    1  2  9  6
    2  4  6  7

1
ব্যবহার করার সময় সতর্ক থাকুন -which, কোনও নকল না থাকলে এটি ত্রুটির দিকে পরিচালিত করবে, ব্যবহার df[!(duplicated(df)), ]নিরাপদ হতে পারে।
জেসন গোল

5

সহ sqldf:

# Example by Mehdi Nellen
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)

সমাধান:

 library(sqldf)
    sqldf('SELECT DISTINCT * FROM df')

আউটপুট:

  a b
1 A 1
2 A 2
3 B 4
4 B 1
5 C 2

এটিতে একটি সম্পূর্ণ এসকিউএল ডাটাবেস স্থাপনের ওভারহেড রয়েছে। cran.r-project.org/web/packages/sqldf/index.html
qwr

একটি সম্পূর্ণ এসকিউএল ডাটাবেস সেট আপ করার অর্থ কী? এটি অন্যতম প্রধান সুবিধা: 'স্ক্যালডিএফ দিয়ে ব্যবহারকারী নিম্নলিখিত কাজগুলি করা থেকে মুক্ত হয়, সেগুলির সমস্ত স্বয়ংক্রিয়ভাবে সম্পন্ন হয়: ডাটাবেস সেটআপ, তৈরি টেবিলের বিবৃতি যা প্রতিটি টেবিলকে সংজ্ঞায়িত করে, আমদানি করে এবং ডাটাবেস থেকে রফতানি করে '। এটি কোনও অনুকূল সমাধান নয়, তবে এসকিউএল-এর সাথে পরিচিতদের জন্য সহজ।
এমপাল্যাঙ্কো

3

অথবা আপনি 4 এবং 5 কলসে ডেটাটি একটি একক সারিতে বাসাতে পারেন tidyr:

library(tidyr)
df %>% nest(V4:V5)

# A tibble: 1 × 4
#                      V1    V2    V3             data
#                  <fctr> <int> <int>           <list>
#1 platform_external_dbus   202    16 <tibble [5 × 2]>

পরিসংখ্যানগত বিশ্লেষণের জন্য কল 2 এবং 3 ডুপ্লিকেটগুলি এখন সরিয়ে ফেলা হয়েছে, তবে আপনি কল 4 এবং 5 ডেটা একটি গোলযোগে রেখেছেন এবং যে কোনও বিন্দুতে মূল ডেটা ফ্রেমে ফিরে যেতে পারেন unnest()


1

একটি ডেটা ফ্রেমের সদৃশ সারিগুলি সরান

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe
distinct(mydata)

এই ডেটাসেটে, একটিও সদৃশ সারি নেই তাই এটি মাইডাটা হিসাবে একই সংখ্যক সারি ফিরেছে।



একটি ভেরিয়েবলের ভিত্তিতে সদৃশ সারিগুলি সরান

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe using carb variable
distinct(mydata,carb, .keep_all= TRUE)

.কিপ_ল ফাংশনটি আউটপুট ডেটা ফ্রেমে অন্য সমস্ত ভেরিয়েবল ধরে রাখতে ব্যবহার করা হয়।



একাধিক ভেরিয়েবলের ভিত্তিতে সদৃশ সারিগুলি সরান

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe using cyl and vs variables
distinct(mydata, cyl,vs, .keep_all= TRUE)

.কিপ_ল ফাংশনটি আউটপুট ডেটা ফ্রেমে অন্য সমস্ত ভেরিয়েবল ধরে রাখতে ব্যবহার করা হয়।

(থেকে: http://www.datasciencemadesimple.com/remove-d નકલ ) -rows-r-using-dplyr-distinct-function/ )


0

এই গ্রুপটি প্রতিটি গ্রুপ থেকে প্রথম সারিটি বেছে নিয়ে সমাধান করা যেতে পারে যেখানে গ্রুপটি কলামগুলি যার ভিত্তিতে আমরা অনন্য মান নির্বাচন করতে চাই (উদাহরণস্বরূপ এটি ভাগ করা হয়েছে এটি কেবল 1 ম কলাম)।

বেস বেস ব্যবহার:

subset(df, ave(V2, V1, FUN = seq_along) == 1)

#                      V1  V2 V3     V4 V5
#1 platform_external_dbus 202 16 google  1

ভিতরে dplyr

library(dplyr)
df %>% group_by(V1) %>% slice(1L)

বা ব্যবহার data.table

library(data.table)
setDT(df)[, .SD[1L], by = V1]

আমাদের যদি একাধিক কলামের উপর ভিত্তি করে অনন্য সারিগুলি সন্ধান করতে হয় তবে কেবলমাত্র উপরের প্রতিটি উত্তরের জন্য গ্রুপিং অংশে column কলামের নামগুলি যুক্ত করুন।

উপাত্ত

df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L), 
.Label = "platform_external_dbus", class = "factor"), 
V2 = c(202L, 202L, 202L, 202L, 202L), V3 = c(16L, 16L, 16L, 
16L, 16L), V4 = structure(c(1L, 4L, 3L, 5L, 2L), .Label = c("google", 
"hughsie", "localhost", "space-ghost.verbum", "users.sourceforge"
), class = "factor"), V5 = c(1L, 1L, 1L, 8L, 1L)), class = "data.frame", 
row.names = c(NA, -5L))

0

এখানে একটি খুব সাধারণ, দ্রুত dplyr/ tidyসমাধান:

সম্পূর্ণ সাদৃশ্যযুক্ত সারিগুলি সরান:

library(dplyr)
iris %>% 
  distinct(.keep_all = TRUE)

কেবলমাত্র নির্দিষ্ট কলামগুলিতে একই সারিগুলি সরিয়ে ফেলুন:

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