2016-04-29 60 views
0

我有一個數據幀,其中行是重複的。我需要從中創建獨特的行。我嘗試了幾個選項,但他們似乎並不工作如何在數據幀中創建唯一行

這適用於某些行,但也給出錯誤「期望單個值」。數據幀'l'看起來像這樣

 bowler overs maidens runs wickets economyRate  date opposition 
    (fctr) (int) (int) (dbl) (dbl)  (dbl)  (date)  (chr) 
1 MA Starc  9  0 51  0  5.67 2010-10-20  India 
2 MA Starc  9  0 27  4  3.00 2010-11-07 Sri Lanka 
3 MA Starc  9  0 27  4  3.00 2010-11-07 Sri Lanka 
4 MA Starc  9  0 27  4  3.00 2010-11-07 Sri Lanka 
5 MA Starc  9  0 27  4  3.00 2010-11-07 Sri Lanka 
6 MA Starc  6  0 33  2  5.50 2012-02-05  India 
7 MA Starc  6  0 33  2  5.50 2012-02-05  India 
8 MA Starc 10  0 50  2  5.00 2012-02-10 Sri Lanka 
9 MA Starc 10  0 50  2  5.00 2012-02-10 Sri Lanka 
10 MA Starc  8  0 49  0  6.12 2012-02-12  India 

日期是唯一的,可用於獲取可以選擇行的行。請讓我知道如何做到這一點。

+0

這是因爲'summarise'爲每個組的組合返回一個值。如果組合中有多個唯一日期,則會導致不平衡。發佈示例數據和預期輸出的結果會更好。 – akrun

+0

dplyr作者正在考慮做一個擴展來支持這個(akrun正在討論的內容),如下所示:https://github.com/hadley/dplyr/issues/154 – Frank

+0

請提供代碼來創建示例data.frame與你的問題?這將允許輕鬆測試答案的正確性,而不會增加海報重新創建數據的負擔。 - 謝謝 – Uwe

回答

1

在示例數據集中,每個'bowler','wickets'組合都有多個'date'元素unique。一個選擇是pasteunique「日期」一起

l %>% 
    group_by(bowler, wickets) %>% 
    summarise(economyRate= mean(economyRate), d = toString(unique(date))) 

或者創建「d」爲list

l %>% 
    group_by(bowler, wickets) %>% 
    summarise(economyRate= mean(economyRate), d = list(unique(date))) 

關於「economyRate」,我猜OP需要mean那個。

如果我們需要創建原始數據集unique日期的列,使用mutate

l %>% 
    group_by(bowler, wickets) %>% 
    mutate(d = list(unique(date))) 

由於OP沒有提供預期的輸出,下面可能也是結果

l %>% 
    group_by(bowler, wickets) %>% 
    distinct(date) 

或者作爲@Frank提到

l %>% 
    group_by(bowler,wickets,date) %>% 
    slice(1L) 
+0

謝謝@akrun!那是我想要的。我終於用以下代碼完成了:%1%{%1%%distinct%(日期) –

0

所以,我花了一個不尋常的途徑去做這種病毒,但是當我從我創建的csv文件結束時,我讓日期成爲一個因素。你可以很容易的日期欄的因素與

l1$date<-as.factor(l1$date) 

這將使該行非排日期,你也可以轉換爲字符,要麼將正常工作。這就是它在結構上看起來的樣子。

str(l1) 
'data.frame': 10 obs. of 10 variables: 
$ bowler  : Factor w/ 2 levels "(fctr)","MA": 2 2 2 2 2 2 2 2 2 2 
$ overs  : Factor w/ 2 levels "(int)","Starc": 2 2 2 2 2 2 2 2 2 2 
$ maidens : Factor w/ 5 levels "(int)","10","6",..: 5 5 5 5 5 3 3 2 2 4 
$ runs  : Factor w/ 2 levels "(dbl)","0": 2 2 2 2 2 2 2 2 2 2 
$ wickets : Factor w/ 6 levels "(dbl)","27","33",..: 6 2 2 2 2 3 3 5 5 4 
$ economyRate: Factor w/ 4 levels "(dbl)","0","2",..: 2 4 4 4 4 3 3 3 3 2 
$ date  : Factor w/ 6 levels "(date)","3","5",..: 5 2 2 2 2 4 4 3 3 6 
$ opposition : Factor w/ 6 levels "(chr)","10/20/2010",..: 2 3 3 3 3 6 6 4 4 5 
$ X.1  : Factor w/ 3 levels "","India","Sri": 2 3 3 3 3 2 2 3 3 2 
$ X.2  : Factor w/ 2 levels "","Lanka": 1 2 2 2 2 1 1 2 2 1 

之後,它是關於確保您使用的是子設置語法用最簡潔的查詢恰當:

l2<-l1[!duplicated(l1$date),] 

而這就是返回,5行獨特的數據:

bowler overs maidens runs wickets economyRate date opposition X.1 X.2 
2  MA Starc  9 0  51   0 5.67 10/20/2010 India  
3  MA Starc  9 0  27   4 3 11/7/2010 Sri Lanka 
7  MA Starc  6 0  33   2 5.5 2/5/2012 India  
9  MA Starc  10 0  50   2 5 2/10/2012 Sri Lanka 
11  MA Starc  8 0  49   0 6.12 2/12/2012 India 

你需要小心的唯一的事情就是保持!duplicated(l1$date)之後逗號,以確保所有列中搜索,幷包含在最終的子集。

如果您想要日期或字符,您可以as.POSIXctas.character將它們轉換爲其餘操作的可用格式。

我希望這對你有用!

1

如果我得到OP權利的意圖,他只是要求刪除重複的行。所以,我會用

unique(l1) 

這就是?unique說:

獨特的返回向量,數據幀或數組,比如x但重複元素/行刪除。

+0

使用'dplyr :: distinct'只保留相似的行。但它不會在這裏工作。 –

+0

@PaulRougieux使用'dplyr'比基本函數'unique'有什麼好處? – Uwe

+0

請參見?distinct,您可以指定「確定唯一性時使用的變量」。例如'a < - data.frame(i = c(1,1,3),j = c(1,1,1))','distinct(a)'與'unique(a)'相同。 ,但你也可以做'distinct(a,j)','distinct(a,i)'。 Plus distinct與SQL數據庫術語類似。 –

1

數據

l <- read.table(text = "bowler overs maidens runs wickets economyRate date opposition 
1 MA_Starc 9 0 51 0 5.67 2010-10-20 India 
2 MA_Starc 9 0 27 4 3.00 2010-11-07 Sri-Lanka 
3 MA_Starc 9 0 27 4 3.00 2010-11-07 Sri-Lanka 
4 MA_Starc 9 0 27 4 3.00 2010-11-07 Sri-Lanka 
5 MA_Starc 9 0 27 4 3.00 2010-11-07 Sri-Lanka 
6 MA_Starc 6 0 33 2 5.50 2012-02-05 India 
7 MA_Starc 6 0 33 2 5.50 2012-02-05 India 
8 MA_Starc 10 0 50 2 5.00 2012-02-10 Sri-Lanka 
9 MA_Starc 10 0 50 2 5.00 2012-02-10 Sri-Lanka 
10 MA_Starc 8 0 49 0 6.12 2012-02-12 India") 

鮮明

使用dplyr ::不同,除去重複的行。

ldistinct <- distinct(l) 
#  bowler overs maidens runs wickets economyRate  date 
# 1 MA_Starc  9  0 51  0  5.67 2010-10-20 
# 2 MA_Starc  9  0 27  4  3.00 2010-11-07 
# 3 MA_Starc  6  0 33  2  5.50 2012-02-05 
# 4 MA_Starc 10  0 50  2  5.00 2012-02-10 
# 5 MA_Starc  8  0 49  0  6.12 2012-02-12 
# opposition 
# 1  India 
# 2 Sri-Lanka 
# 3  India 
# 4 Sri-Lanka 
# 5  India 
l2 <- summarise(group_by(ldistinct,bowler,wickets), 
       economyRate,d=unique(date)) 
# Error: expecting a single value 

但還不夠在這裏,還是有投球手和小門的 一個組合很多日期。

收起值加在一起

通過粘貼多個值加在一起,你會看到有很多的日期,許多economyRate的投球手和售票窗口的單一組合。

l3 <- summarise(group_by(l,bowler,wickets), 
       economyRate = paste(unique(economyRate),collapse=", "), 
       d=paste(unique(date),collapse=", ")) 
l3 

#  bowler wickets economyRate      d 
#  (fctr) (int)  (chr)     (chr) 
# 1 MA_Starc  0 5.67, 6.12 2010-10-20, 2012-02-12 
# 2 MA_Starc  2  5.5, 5 2012-02-05, 2012-02-10 
# 3 MA_Starc  4   3    2010-11-07 
相關問題