Еще один способ, которым я нахожу удобным, это:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
(s<-summary (as.factor(numbers)))
Это преобразует набор данных в коэффициент, а затем summary () дает нам контрольные итоги (подсчеты уникальных значений).
Выход:
4 5 23 34 43 54 56 65 67 324 435 453 456 567 657
2 1 2 2 1 1 2 1 2 1 3 1 1 1 1
Это может быть сохранено в качестве кадра данных, если это необходимо.
as.data.frame (cbind (Number = names (s)), Freq = s), strAsAsFactors = F, row.names = 1: length (s))
blockquote>здесь row.names используется для переименования имен строк. без использования row.names, имена столбцов в s используются в качестве имен строк в новом фрейме данных
. Выход:
Number Freq 1 4 2 2 5 1 3 23 2 4 34 2 5 43 1 6 54 1 7 56 2 8 65 1 9 67 2 10 324 1 11 435 3 12 453 1 13 456 1 14 567 1 15 657 1
Более безопасным подходом было бы сначала найти Lap
, когда кто-нибудь получил травму (NA
в Time
), а затем удалить все данные с этого Lap
и далее
subset(race[order(race$Lap), ], Lap < Lap[which.max(is.na(Time))])
# Runner Time Lap
#1 John 1 1
#2 Elsa 3 1
#3 Tim 5 1
и с помощью [ 116], что было бы
library(dplyr)
race %>%
arrange(Lap) %>%
filter(Lap < Lap[which.max(is.na(Time))])
Это сначала упорядочивает данные по Lap
, which.max(is.na(Time)
находит индекс, где впервые встретился NA
, мы берем соответствующий Lap
и сохраняем все строки меньше этого Lap
.
Это все равно будет работать, если у вас есть 10 Lap
с в вашем наборе данных, и какой-то игрок получил травму в 6-м Lap
.
Мы также можем использовать subset
из base R
subset(race, Lap == 1)
. Вот способ сделать это через базу R. Мы разделимся на Runner
после того, как очистим от NA. Затем мы intersect
Lap
и оставляем только те, которые найдены в этом пересечении, т.е.
race[race$Lap %in% Reduce(intersect, split(race$Lap[!is.na(race$Time)], race$Runner[!is.na(race$Time)])),]
# Runner Time Lap
#1 John 1 1
#3 Elsa 3 1
#5 Tim 5 1