डुप्लिकेट पंक्तियों को निकालें


152

मैंने एक CSVफाइल को R data.frame में पढ़ा है । कुछ पंक्तियों में एक स्तंभ में एक ही तत्व है। मैं उस कॉलम में डुप्लिकेट वाली पंक्तियों को निकालना चाहूंगा। उदाहरण के लिए:

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?
एंथनी डैमिको

मेरे सांख्यिकीय विश्लेषण के इस हिस्से के लिए कोई फर्क नहीं पड़ता। मैं केवल प्रोजेक्ट टाइटल (पहला कॉलम), बग की संख्या (दूसरा कॉलम), और प्रोजेक्ट पर संगठनों की संख्या (तीसरा कॉलम) से संबंधित करने का प्रयास कर रहा हूं।
user1897691

3
ठंडा। अनावश्यक स्तंभों को बाहर फेंकें और उपयोग करें? अद्वितीय
एंथोनी डैमिको

जवाबों:


186

अपने डेटा फ़्रेम को आपके द्वारा आवश्यक स्तंभों से अलग करें, फिर अद्वितीय फ़ंक्शन का उपयोग करें: D

# 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]कि उस कोड के हिस्से के साथ क्या हो रहा है ? मैं आर के लिए नया हूं, यही कारण है कि मैं पूछ रहा हूं कि मैं क्या मान सकता हूं यह एक स्पष्ट सवाल है।
user1897691

6
@ user1897691 निशान तो यह सही रूप में;) इस घड़ी और आप ऐसा करते हैं, जाँच twotorials.com
एंथोनी damico

3
ध्यान दें कि यह तीनों को छोड़कर सभी कॉलमों को हटा देगा।
GuillaumeL

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

से उत्तर: R डेटा फ्रेम से डुप्लिकेट पंक्तियों को हटाना


मैं एक नया varibale एक नकली है या नहीं है कि झंडे का निर्माण करना चाहते एक निश्चित चर पर ifelse (कॉलम में यह पंक्तियाँ मूल्य एक == स्तंभ एक में पिछली पंक्ति मूल्य, 1, 0) - लगभग df $ डुप्लिकेट <की तरह
याकूब

@jacob इस सवाल को देखें stackoverflow.com/questions/12495345/…
dpel

2
यह पहले प्रदर्शित मूल्य रखता है और बाकी डुप्लिकेट को हटा देता है, है ना? या यह बेतरतीब ढंग से मूल्यों को हटा देता है?
News_is_Selection_Bias

@alppretagamma हाँ, यह पहली बार प्रदर्शित मूल्य
मेहदी नेलन

2
यदि आप केवल कुछ कॉलम में डुप्लिकेट में रुचि रखते हैं, तो df[!duplicated(df[, 1:2])]
कॉल

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
यह सैम फिर्के के जवाब के समान है, लेकिन कम विवरण के साथ।
क्यूर

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

इसमें संपूर्ण SQL डेटाबेस सेट करने का ओवरहेड है। cran.r-project.org/web/packages/sqldf/index.html
qwr

पूरे SQL डेटाबेस को सेट करने से आपका क्या मतलब है? यह मुख्य लाभ में से एक है: 'sqldf के साथ उपयोगकर्ता को निम्नलिखित कार्य करने से मुक्त किया जाता है, जो सभी स्वचालित रूप से किए जाते हैं: डेटाबेस सेटअप, बनाने के लिए तालिका विवरण जो प्रत्येक तालिका को परिभाषित करता है, आयात और डेटाबेस से आयात और निर्यात करता है। '। यह एक इष्टतम समाधान नहीं है, लेकिन SQL से परिचित लोगों के लिए आसान है।
म्पलांचो

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)

इस डेटासेट में, एक भी डुप्लिकेट पंक्ति नहीं है, इसलिए यह mydata के समान पंक्तियों की संख्या को लौटाता है।



एक चर के आधार पर डुप्लिकेट पंक्तियाँ निकालें

library(dplyr)
mydata <- mtcars

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

.Keep_all फ़ंक्शन का उपयोग आउटपुट डेटा फ़्रेम में अन्य सभी चर को बनाए रखने के लिए किया जाता है।



कई चर के आधार पर डुप्लिकेट पंक्तियाँ निकालें

library(dplyr)
mydata <- mtcars

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

.Keep_all फ़ंक्शन का उपयोग आउटपुट डेटा फ़्रेम में अन्य सभी चर को बनाए रखने के लिए किया जाता है।

(से: http://www.datasciencemadesimple.com/remove-duplicate-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]

यदि हमें कई स्तंभों पर आधारित अद्वितीय पंक्तियों का पता लगाने की आवश्यकता है, तो उपरोक्त उत्तर में से प्रत्येक के लिए समूहीकरण भाग में उन स्तंभ नामों को जोड़ें।

डेटा

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.