2016-04-29 49 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 
相关问题