【问题标题】:How do I extract only the first rows of grouped items in R? [duplicate]如何仅提取 R 中分组项目的第一行? [复制]
【发布时间】:2019-07-21 20:52:58
【问题描述】:

我从Lahman 数据库中按字母顺序列出了纽约大都会队的棒球运动员。对于每个球员来说,他的出场年限是按升序排列的。我需要为每个玩家提取他玩的第一年的数据,并将所有第一行放入一个新的数据框中。

RStudio 我的Mac 上,我已经达到了对我需要的数据进行分组和排序的地步。这是一个示例。

playerID,yearID,G,AB,R,H
aceveju01,1997,25,6,0,0
acostma01,2010,41,0,0,0
acostma01,2011,44,0,0,0
acostma01,2012,45,0,0,0
adkinjo01,2007,1,0,0,0
agbaybe01,1998,11,15,1,2
agbaybe01,1999,101,276,42,79
agbaybe01,2000,119,350,59,101
agbaybe01,2001,91,296,28,82
ageeto01,1968,132,368,30,80
ageeto01,1969,149,565,97,153
ageeto01,1970,153,636,107,182
ageeto01,1971,113,425,58,121
ageeto01,1972,114,422,52,96
aguilch01,2008,8,12,0,2

出于测试目的,我从这段代码开始,而不是piping。这就是我所能达到的程度。

Lahman_batting18 <- read.csv('Batting-copy.csv', header = TRUE, stringsAsFactors=FALSE)
Lahman_batting18s <- select(Lahman_batting18,playerID:SO)
Lahman_batting18f <- filter(Lahman_batting18s,teamID == 'NYN')
Lahman_batting18fa <- arrange(Lahman_batting18f, playerID, yearID)

期望的输出:

playerID,yearID,G,AB,R,H
aceveju01,1997,25,6,0,0
acostma01,2010,41,0,0,0
adkinjo01,2007,1,0,0,0
agbaybe01,1998,11,15,1,2
ageeto01,1968,132,368,30,80
aguilch01,2008,8,12,0,2

感谢您的帮助!

【问题讨论】:

  • d[ave(1:NROW(d), d$playerID, FUN = seq_along) == 1,]
  • @d.b.你的代码是如何工作的?
  • 您好metsfan,如果可以解决您的问题,请您接受答案(答案旁边的勾号...)?然后它表明问题已解决。
  • Lahman_batting18 %&gt;% group_by(playerID) %&gt;% slice(1L)
  • @RonakShah 使用 slice(1L) 和 slice(1) 有什么区别?

标签: r group-by subset data-manipulation


【解决方案1】:

d.b 使用基础r,而我更喜欢dplyrpipes。

Lahman_batting18 %>% group_by(playerID) %>% arrange(playerID, yearID) %>% 
filter(yearID == min(yearID))

只过滤最少的年份。我希望这是你想要的?我使用您的示例数据得到的输出:

# A tibble: 6 x 6
# Groups:   playerID [6]
  playerID  yearID     G    AB     R     H
  <fct>      <int> <int> <int> <int> <int>
1 aceveju01   1997    25     6     0     0
2 acostma01   2010    41     0     0     0
3 adkinjo01   2007     1     0     0     0
4 agbaybe01   1998    11    15     1     2
5 ageeto01    1968   132   368    30    80
6 aguilch01   2008     8    12     0     2

【讨论】:

  • 在您的输出中,playerID 不是按字母顺序排列的,而这正是我希望的。你的按 yearID 排序。
  • 抱歉,已更正。现在输出与我提到的代码完全相同...
  • @Ronak Shah 今天,我使用以下 2 个解决方案检查了第一行的总数: (1) Season1_all % group_by(playerID) %>%arrange(playerID, yearID) % >% filter(yearID == min(yearID)) (2) Season1_all2 % group_by(playerID) %>% slice(1) 我希望解决方案中的总行数相同,但它们不是。解决方案 1 有 19,999 行;而解决方案 2 有 19,428 行。此外,当我运行“distinct(Lahman_batting18, playerID)”时,我也得到了 19,428 行。为什么我得到不同的数字?哪个解决方案给出了正确的总数?
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多