如何在数据框中创建唯一的行

时间:2016-04-29 03:49:10

标签: r dplyr

我有一个数据框,其中行是重复的。我需要从中创建唯一的行。我尝试了几种选择,但它们似乎无法正常工作

  l1 <-summarise(group_by(l,bowler,wickets),economyRate,d=unique(date))

这适用于某些行,但也会出现错误“Expecting a one value”。数据帧'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   

日期是唯一的,可用于获取可以选择行的行。请让我知道如何做到这一点。

4 个答案:

答案 0 :(得分:1)

在示例数据集中,每个'投球手','wickets'组合中有多个{date}元素{date}'。一种选择是unique paste'日期'在一起

unique

或将“d”创建为l %>% group_by(bowler, wickets) %>% summarise(economyRate= mean(economyRate), d = toString(unique(date)))

list

关于'economicRate',我猜OP需要l %>% group_by(bowler, wickets) %>% summarise(economyRate= mean(economyRate), d = list(unique(date)))

如果我们需要在原始数据集中创建mean日期列,请使用unique

mutate

由于OP没有提供预期的输出,下面也可能是结果

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

或者@Frank提到

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

答案 1 :(得分:1)

如果我认为OP的意图是正确的,他就是要求简单地删除重复的行。所以,我会用

flatMapping

这就是unique(l1) 所说的:

  

unique返回一个向量,数据框或数组,如x,但删除了重复的元素/行。

答案 2 :(得分: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 :: distinct删除重复的行。

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

但这里还不够,还有很多日期 保龄球和小门的一个组合。

一起折叠值

通过将多个值粘贴在一起,您会发现投球手和门票的单一组合有很多日期和许多economicRate。

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

答案 3 :(得分: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将其转换为可用的格式,以便进行其他操作。

我希望这对你有用!