我有一个数据框,其中行是重复的。我需要从中创建唯一的行。我尝试了几种选择,但它们似乎无法正常工作
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
日期是唯一的,可用于获取可以选择行的行。请让我知道如何做到这一点。
答案 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.POSIXct
或as.character
将其转换为可用的格式,以便进行其他操作。
我希望这对你有用!