Интересно, как я могу удалить столбцы из фрейма данных в R на основе указанного порядка значений строк.
Предположим, что следующий фрейм данных:
df <- data.frame(a = c(1,6,2,5,2,0,9,3,21,15,4,0,5,2,1),
b = c(0,0,1,0,0,0,5,0,0,0,0,2,0,0,0),
c = c(1,1,1,1,0,0,0,0,0,10,10,10,10,10,0))
a b c
1 1 0 1
2 6 0 1
3 2 1 1
4 5 0 1
5 2 0 0
6 0 0 0
7 9 5 0
8 3 0 0
9 21 0 0
10 15 0 10
11 4 0 10
12 0 2 10
13 5 0 10
14 2 0 10
15 1 0 0
Теперь я хочу идентифицировать и удалить любой столбец со следующей последовательностью значений строки: 0, любое другое значение, 0,0,0. Допустим, эта последовательность должна встречаться не менее 3 раз в столбце, чтобы этот столбец был удален. Итак, используя мой пример, я хотел бы добиться следующего:
a c
1 1 1
2 6 1
3 2 1
4 5 1
5 2 0
6 0 0
7 9 0
8 3 0
9 21 0
10 15 10
11 4 10
12 0 10
13 5 10
14 2 10
15 1 0
Спасибо!
Я только что увидел, что вы отредактировали свой пост. Да, порядок в вашем примере будет соответствовать.
Извините, я думал, что добавил 3 нуля после того, как ранее.
Что делать, если есть совпадения между матчами? Например, сколько спичек здесь? 0 1 0 0 0 1 0 0 0
Хороший вопрос! Спасибо! Это будет два матча.
@DirkButtke Изначально я думал, что вы хотите, чтобы матч был 0 1 0 0 0
Может быть, вы имели в виду 0 1 0 1 0 1
как 3 матча?
Вы можете использовать функцию типа «rollapply», чтобы проверить свое состояние для каждого окна из 5 элементов, затем взять сумму и посмотреть, есть ли у вас, например. >= 3 совпадения.
Можно изменить либо ширину окна, 5, (количество элементов в вашем шаблоне), количество совпадений, 3, либо функцию проверки условия my_condition
, в зависимости от конкретной проблемы.
library(data.table) # for frollapply. or use library(zoo) and rollapply
my_condition <- function(x) all(x[c(1, 3:5)] == 0)
cond_match <-
sapply(df, function(x) sum(frollapply(x, 5, my_condition, fill = 0L)) >= 3)
df[cond_match == FALSE] # or if df is a data.table, df[, cond_match == FALSE, with = FALSE]
# a c
# 1 1 1
# 2 6 1
# 3 2 1
# 4 5 1
# 5 2 0
# 6 0 0
# 7 9 0
# 8 3 0
# 9 21 0
# 10 15 10
# 11 4 10
# 12 0 10
# 13 5 10
# 14 2 10
# 15 1 0
Считаете ли вы
0 0 0 1 0 0 0
совпадением