Как добавить строки с самыми последними данными «Год», когда переменная «Год» не является последовательной - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть небольшой фрейм данных, содержащий времена мирового рекорда (WR) для женщин на 10000м.Несколько лет новый рекорд не был установлен, но, конечно, предыдущий WR сохранялся до следующего года, пока не был установлен новый.Я хочу, чтобы фрейм данных завершился в 2015 году.

Мне нужно добавить строки, в которых переменная "Year" имеет пропуски, и заполнить пропуски данными предыдущего WR.

#Current section of dataframe (gap from '86-'93 then '93-2015):

  Result Year  Event Gender
1  31.35 1982 10000m  women
2  31.35 1983 10000m  women
3  31.28 1983 10000m  women
4  31.14 1984 10000m  women
5  30.59 1985 10000m  women
6  30.14 1986 10000m  women
7  29.32 1993 10000m  women

#Required result:

  Result Year  Event Gender
1  31.35 1982 10000m  women
2  31.35 1983 10000m  women
3  31.28 1983 10000m  women
4  31.14 1984 10000m  women
5  30.59 1985 10000m  women
6  30.14 1986 10000m  women
7  30.14 1987 10000m  women
8  30.14 1988 10000m  women
9  30.14 1989 10000m  women
10 30.14 1990 10000m  women
11 30.14 1991 10000m  women
12 30.14 1992 10000m  women
13 29.32 1993 10000m  women
14 29.32 1994 10000m  women
...etc

(continue last result until 2015)

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Вы можете сначала заполнить набор данных, указав годы, которые вы хотите заполнить, а затем заполните предыдущие значения для каждого пропущенного года.Группируйте по событию и полу, чтобы вы могли правильно указать значения для каждой комбинации.

library(tidyr)
library(dplyr)

wr %>%
  group_by(Event, Gender) %>% 
  complete(Year = min(Year):2015) %>% 
  fill(Result, .direction = "down")

# A tibble: 35 x 4
# Groups:   Event, Gender [1]
#    Event  Gender  Year Result
#    <fct>  <fct>  <int>  <dbl>
#  1 10000m women   1982   31.4
#  2 10000m women   1983   31.4
#  3 10000m women   1983   31.3
#  4 10000m women   1984   31.1
#  5 10000m women   1985   30.6
#  6 10000m women   1986   30.1
#  7 10000m women   1987   30.1
#  8 10000m women   1988   30.1
#  9 10000m women   1989   30.1
# 10 10000m women   1990   30.1
# ... with 25 more rows
0 голосов
/ 17 февраля 2019

Предполагая, что входные данные в примечании в конце объединяют фрейм входных данных с фреймом данных всех лет и используют na.locf из зоопарка, чтобы заполнить его.

library(zoo)
Year <- data.frame(Year = min(DF$Year):2015)
m <- na.locf(merge(DF, Year, all.y = TRUE), na.rm = FALSE)

(продолжение после вывода):

> m
   Year Result  Event Gender
1  1982  31.35 10000m  women
2  1983  31.35 10000m  women
3  1983  31.28 10000m  women
4  1984  31.14 10000m  women
5  1985  30.59 10000m  women
6  1986  30.14 10000m  women
7  1987  30.14 10000m  women
8  1988  30.14 10000m  women
9  1989  30.14 10000m  women
10 1990  30.14 10000m  women
11 1991  30.14 10000m  women
12 1992  30.14 10000m  women
13 1993  29.32 10000m  women
14 1994  29.32 10000m  women
15 1995  29.32 10000m  women
16 1996  29.32 10000m  women
17 1997  29.32 10000m  women
18 1998  29.32 10000m  women
19 1999  29.32 10000m  women
20 2000  29.32 10000m  women
21 2001  29.32 10000m  women
22 2002  29.32 10000m  women
23 2003  29.32 10000m  women
24 2004  29.32 10000m  women
25 2005  29.32 10000m  women
26 2006  29.32 10000m  women
27 2007  29.32 10000m  women
28 2008  29.32 10000m  women
29 2009  29.32 10000m  women
30 2010  29.32 10000m  women
31 2011  29.32 10000m  women
32 2012  29.32 10000m  women
33 2013  29.32 10000m  women
34 2014  29.32 10000m  women
35 2015  29.32 10000m  women

или, если у всего файла есть несколько событий и полов, разделите его по событиям и полу и примените одинаковую обработку к каждому компоненту разделения, связав его вместе в конце.Из этого вопроса нельзя сказать, поэтому мы предположили, что каждое событие / пол должно начинаться с минимального года для всех событий и полов и заканчиваться в 2015 году, но это предположение можно легко изменить.

f <- function(x) na.locf(merge(x, Year, all.y = TRUE), na.rm = FALSE)
out <- do.call("rbind", by(DF, DF[3:4], f))
rownames(out) <- NULL

Примечание

Lines <- "
  Result Year  Event Gender
1  31.35 1982 10000m  women
2  31.35 1983 10000m  women
3  31.28 1983 10000m  women
4  31.14 1984 10000m  women
5  30.59 1985 10000m  women
6  30.14 1986 10000m  women
7  29.32 1993 10000m  women"
DF <- read.table(text = Lines)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...