Получите индексы хвоста для нескольких значений одновременно в R-кадре данных - PullRequest
0 голосов
/ 12 июня 2018

Извиняюсь, если вопрос немного многословный, однако я уверен, что приведенный здесь пример прояснит ситуацию.У меня есть следующий фрейм данных:

structure(list(teamName = c("Brazil", "Germany", "Spain", "England", 
"France", "Spain", "France", "Germany", "Brazil", "England", 
"Spain", "France", "Brazil"), wins = c(0, 0, 0, 0, 0, 1, 1, 1, 
1, 1, 1, 2, 1), losses = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
1), ties = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0)), .Names = c("teamName", 
"wins", "losses", "ties"), row.names = c(NA, 13L), class = "data.frame")

   teamName wins losses ties
1    Brazil    0      0    0
2   Germany    0      0    0
3     Spain    0      0    0
4   England    0      0    0
5    France    0      0    0
6     Spain    1      0    0
7    France    1      0    0
8   Germany    1      0    0
9    Brazil    1      0    0
10  England    1      0    0
11    Spain    1      0    1
12   France    1      0    1
13   Brazil    1      1    0

, в котором есть несколько футбольных стран, и я хотел бы отфильтровать этот фрейм данных так, чтобы он включал только последнюю строку для каждой команды.Хотя здесь 5 команд, это не обязательно тот случай, когда 5 последних строк в кадре данных - это те 5 строк, которые мне нужны.В этом случае есть 2 строки для Бразилии перед последней строкой в ​​Германии.

В этом примере индексы строк для последней строки для каждой команды составляют 8, 10, 11, 12 и 13.

Существует ли простой способ получить эти индексы без необходимостииспользовать для цикла?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Вы можете сделать это в базе R, используя duplicated

Soccer[!duplicated(Soccer$teamName, fromLast=TRUE),]
   teamName wins losses ties
8   Germany    1      0    0
10  England    1      0    0
11    Spain    1      0    1
12   France    2      0    1
13   Brazil    1      1    0
0 голосов
/ 13 июня 2018
library(dplyr)
df %>% 
  group_by(teamName) %>% 
  do(tail(., 1))


  teamName  wins losses  ties
  <chr>    <dbl>  <dbl> <dbl>
1 Brazil      1.     1.    0.
2 England     1.     0.    0.
3 France      2.     0.    1.
4 Germany     1.     0.    0.
5 Spain       1.     0.    1.

Или с таблицей данных:

library(data.table)
dt <- as.data.table(df)
dt[, tail(.SD, 1), teamName]

  teamName wins losses ties
1:   Brazil    1      1    0
2:  Germany    1      0    0
3:    Spain    1      0    1
4:  England    1      0    0
5:   France    2      0    1
0 голосов
/ 12 июня 2018

Сначала добавьте столбец для включения номера строки.А затем можно использовать dplyr::slice и выбрать последний n() для каждой группы.

library(dplyr)
df %>% mutate(row_num = row_number()) %>%
  group_by(teamName) %>%
  slice(n()) %>% arrange(row_num)

# # A tibble: 5 x 5
# # Groups: teamName [5]
#    teamName  wins losses  ties row_num
#     <chr>    <dbl>  <dbl> <dbl>   <int>
# 1 Germany   1.00   0     0          8
# 2 England   1.00   0     0         10
# 3 Spain     1.00   0     1.00      11
# 4 France    2.00   0     1.00      12
# 5 Brazil    1.00   1.00  0         13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...