Как удалить все строки, которые не соответствуют всем условиям (для группы)?

Еще один способ, которым я нахожу удобным, это:

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))

здесь 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
2
задан Sergio Romero 29 March 2019 в 10:25
поделиться

3 ответа

Более безопасным подходом было бы сначала найти 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.

0
ответ дан Ronak Shah 29 March 2019 в 10:25
поделиться

Мы также можем использовать subset из base R

subset(race, Lap == 1)
.
0
ответ дан akrun 29 March 2019 в 10:25
поделиться

Вот способ сделать это через базу 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
0
ответ дан Sotos 29 March 2019 в 10:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: