首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于R中的多准则删除数据帧中的行

基于R中的多准则删除数据帧中的行
EN

Stack Overflow用户
提问于 2018-08-30 08:32:16
回答 2查看 2.1K关注 0票数 2

我希望我的问题格式是正确的,因为这是我第一次发帖,对R.

下面是我目前使用的一些运动员运动数据的一个小样本。

代码语言:javascript
运行
复制
代码语言:javascript
运行
复制
  Player   Period      Dist    Date          Type

Player_2 4245.9002 31/7/18主要培训

123个Player_1课程4868.2153 2/8/18主要培训

124年Player_2课程4515.1996 2/8/18主要培训

Player_2 3215.8634 7/8/18主要培训

126 Player_2修改551.8737 7/8/18主要训练

127年Player_2 4264.7384 9/8/18主要培训

Player_1课程4038.1687 16/8/18主要培训

129 Player_2课程4751.6978 16/8/18主要培训

130 Player_1 RTP 4038.1687 16/8/18主要培训

131 Player_2修改229.6872 16/8/18主要训练

132 Player_2改进342.2797 16/8/18主要训练

133个Player_1课程3573.4509 23/8/18主要培训

Player_2课程3717.3467 23/8/18主要培训

reprex()

#>错误::1:16:意外符号

#> 1:播放时间

#> ^

代码语言:javascript
运行
复制

我想使用dplyr根据多个标准删除数据帧中的行。具体来说,我想删除包含Session的行,其中有ModifiedRTP共享相同的Date。例如,当Player_2完成Modified关于7/8/2018的培训时,我希望删除该日期的Session数据。

代码语言:javascript
运行
复制
代码语言:javascript
运行
复制
  Player   Period      Dist   Date          Type

Player_2 3215.8634 7/8/18主要培训

126 Player_2修改551.8737 7/8/18主要训练

#>错误::1:16:意外符号

#> 1:播放时间

#> ^

代码语言:javascript
运行
复制

同样,对于16/8/2018Player_1Player_2在这一天分别完成了ModifiedRTP培训。

代码语言:javascript
运行
复制
代码语言:javascript
运行
复制
  Player   Period      Dist    Date          Type

Player_1课程4038.1687 16/8/18主要培训

129 Player_2课程4751.6978 16/8/18主要培训

130 Player_1 RTP 4038.1687 16/8/18主要培训

131 Player_2修改229.6872 16/8/18主要训练

132 Player_2改进342.2797 16/8/18主要训练

#>错误::1:16:意外符号

#> 1:播放时间

#> ^

代码语言:javascript
运行
复制

过去,我使用这样的代码过滤过数据。

代码语言:javascript
运行
复制

db18 <- db18 %>%

筛选器(%c(“会话”)中的句点%)

代码语言:javascript
运行
复制

但是,我希望删除包含ModifiedRTP的运动员Modified数据,因为它不会“污染”我试图执行的分析。想知道如果可能的话我该怎么做。

任何帮助都将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-30 10:15:37

一种方法是首先使用group_by()函数,然后将过滤器应用到组中。在下面的代码中,我使用了group_by()mutate()来创建一个新列来进行筛选。也许有一个更优雅的解决方案,但这可能会让您开始。

代码语言:javascript
运行
复制
df <- tibble::tribble(
~Player,   ~Period,      ~Dist,    ~Date,       
'Player_2',  'Session', 4245.9002, '31/7/18',
'Player_1',  'Session', 4868.2153, '2/8/18',
'Player_2',  'Session', 4515.1996,  '2/8/18',
'Player_2',  'Session', 3215.8634,  '7/8/18',
'Player_2', 'Modified',  551.8737,  '7/8/18',
'Player_2',  'Session', 4264.7384,  '9/8/18',
'Player_1',  'Session', 4038.1687, '16/8/18',
'Player_2',  'Session', 4751.6978, '16/8/18',
'Player_1',      'RTP', 4038.1687, '16/8/18',
'Player_2', 'Modified',  229.6872, '16/8/18',
'Player_2', 'Modified',  342.2797, '16/8/18',
'Player_1',  'Session', 3573.4509, '23/8/18',
'Player_2',  'Session', 3717.3467, '23/8/18'
)

df %>%
  group_by(Player, Date) %>%
  mutate(filter_col = ifelse(all(c('Session','Modified') %in% Period), 'delete', 'keep'),
         filter_col = ifelse(all(c('Session','RTP') %in% Period), 'delete', filter_col)) %>%
  ungroup() %>%
  filter(filter_col == 'keep')
票数 1
EN

Stack Overflow用户

发布于 2018-08-31 05:05:33

希望这能帮到你。

代码语言:javascript
运行
复制
player <- read.csv("player.csv")
player

player
    Id   Player   Period      Dist     Date          Type
1  122 Player_2  Session 4245.9002 31/07/18 Main Training
2  123 Player_1  Session 4868.2153 02/08/18 Main Training
3  124 Player_2  Session 4515.1996 02/08/18 Main Training
4  125 Player_2  Session 3215.8634 07/08/18 Main Training
5  126 Player_2 Modified  551.8737 07/08/18 Main Training
6  127 Player_2  Session 4264.7384 09/08/18 Main Training
7  128 Player_1  Session 4038.1687 16/08/18 Main Training
8  129 Player_2  Session 4751.6978 16/08/18 Main Training
9  130 Player_1      RTP 4038.1687 16/08/18 Main Training
10 131 Player_2 Modified  229.6872 16/08/18 Main Training
11 132 Player_2 Modified  342.2797 16/08/18 Main Training
12 133 Player_1  Session 3573.4509 23/08/18 Main Training
13 134 Player_2  Session 3717.3467 23/08/18 Main Training

PlayerDate列分组。然后提取Id,如果某个特定的DateModified(or)RTPSession

代码语言:javascript
运行
复制
library(dplyr)
removable <- player %>%  group_by_(.dots = c("Player", "Date")) %>% 
  filter( (sum(Period == 'Session') >= 1) & ((sum(Period == 'Modified') != 0) | (sum(Period == 'RTP') != 0 ))) %>%
  filter(Period == 'Session')

现在,如果有任何playerremovable$Id匹配,则从removable$Id数据中删除行

代码语言:javascript
运行
复制
player <- player[!(player$Id  %in% removable$Id), ]
player

    Id   Player   Period      Dist     Date          Type
1  122 Player_2  Session 4245.9002 31/07/18 Main Training
2  123 Player_1  Session 4868.2153 02/08/18 Main Training
3  124 Player_2  Session 4515.1996 02/08/18 Main Training
5  126 Player_2 Modified  551.8737 07/08/18 Main Training
6  127 Player_2  Session 4264.7384 09/08/18 Main Training
9  130 Player_1      RTP 4038.1687 16/08/18 Main Training
10 131 Player_2 Modified  229.6872 16/08/18 Main Training
11 132 Player_2 Modified  342.2797 16/08/18 Main Training
12 133 Player_1  Session 3573.4509 23/08/18 Main Training
13 134 Player_2  Session 3717.3467 23/08/18 Main Training
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52092518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档