Суммирование строк в фрейме данных на основе значений нескольких столбцов - PullRequest
0 голосов
/ 13 января 2019

Я работаю с большим количеством данных футболистов колледжа и их статистикой по играм. Это выглядит примерно так:

Name      School     Year     Receptions     Receiving_Yards
Player1   College1   2004       10                200 
Player2   College2   2002       15                150
Player3   College3   2007       11                110
Player1   College1   2004       17                150
Player2   College2   2002       13                130
Player1   College1   2005       14                170

Я хочу иметь возможность комбинировать строки по нескольким критериям:

  1. Я хочу создать фрейм данных, который объединяет все, основываясь на игроке, школе и году, чтобы получить его совокупную статистику за этот сезон. Вот так:

    Name      School     Year     Receptions     Receiving_Yards
    Player1   College1   2004       27                350 
    Player2   College2   2002       28                280
    Player3   College3   2007       11                110
    Player1   College1   2005       14                170
    
  2. Я хочу создать фрейм данных, который объединяет все, основываясь только на игроке и школе (то есть, получить мне статистику карьеры), но дает мне промежуток года:

    Name      School     From    to      Receptions     Receiving_Yards
    Player1   College1   2004   2005        41                520 
    Player2   College2   2002   2002        28                280
    Player3   College3   2007   2007        11                110
    

Я не совсем женат, чтобы получить годовой интервал для двоих, поскольку вряд ли слишком много игроков с одинаковыми именами играли в одной школе.

Я видел несколько постов о комбинировании строк, основанных только на одном условии, но как бы я это сделал, когда использовал несколько условий?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Добавление альтернативы data.table:

library(data.table)
df1<-copy(df)
setDT(df1)
df1[,`:=`(From=first(Year),To=last(Year)),by=.(Name,School)
][,lapply(.SD,sum),by=.(Name,School,From,To),.SDcols=c("Receptions","Receiving_Yards")]

Выход:

     Name   School  From   To     Receptions Receiving_Yards
1: Player2 College2 2002 2002         28             280
2: Player1 College1 2004 2005         41             520
3: Player3 College3 2007 2007         11             110

Другая часть:

df1<-copy(df)
setDT(df1)
df1[,lapply(.SD,sum),by=.(Name,School,Year)]

или, если вы не хотите переделывать data.table, удалите столбцы из последней части (которая привела к первому выводу)

#df1<-copy(df) No need,see next
#setDT(df1) No need since you're using the same object as previously used
df1[,`:=`(From=NULL,To=NULL)]
df1[,lapply(.SD,sum),by=.(Name,School,Year)]
df1

Выход:

      Name   School Year Receptions Receiving_Yards
1: Player1 College1 2004         27             350
2: Player2 College2 2002         28             280
3: Player3 College3 2007         11             110
4: Player1 College1 2005         14             170
0 голосов
/ 13 января 2019

Конечно, вы можете использовать Tidyverse способ ее решения. Я предоставляю базовый способ здесь.

Первый результат

aggregate(. ~ Name + School + Year, df, sum)

#      Name   School Year Receptions Receiving_Yards
# 1 Player2 College2 2002         28             280
# 2 Player1 College1 2004         27             350
# 3 Player1 College1 2005         14             170
# 4 Player3 College3 2007         11             110

Второй результат

a <- aggregate(cbind(Receptions, Receiving_Yards) ~ Name + School, df, sum)
b <- aggregate(Year ~ Name + School, df, range)
merge(a, b)

#      Name   School Receptions Receiving_Yards Year.1 Year.2
# 1 Player1 College1         41             520   2004   2005
# 2 Player2 College2         28             280   2002   2002
# 3 Player3 College3         11             110   2007   2007

Решение с использованием dplyr

library(dplyr)

# (1)
df %>% group_by(Name, School, Year) %>% summarise_all(sum)

# (2)
df %>% group_by(Name, School) %>%
  summarise(From = first(Year), To = last(Year),
            Receptions = sum(Receptions),
            Receiving_Yards = sum(Receiving_Yards))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...