R удалить нули на основе критериев из другого столбца - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу создать новый набор данных из существующего, удалив строки из переменной во фрейме данных, которые имеют 0 в качестве последних значений для каждого уровня другой переменной. Пример:

set.seed(100)

ID<-rep(1:20, each=5)
ID

var1<-sample(c(0, 1,2, 3), size = 100, replace = TRUE, prob = c(0.6,0.1, 0.1, 0.1))
var1
df <- data.frame(ID,var1)
head(df,15)

   ID var1
1   1    0
2   1    3
3   1    0
4   1    3
5   1    1
6   2    0
7   2    0
8   2    1
9   2    0
10  2    0
11  3    1
12  3    0
13  3    2
14  3    0
15  3    0

Переменная «ID» имеет 20 уровней, для каждого уровня идентификатора я хочу удалить строки из фрейма данных, заканчивающиеся на 0. Например, последняя строка идентификатора 1 в строке 5 имеет значение 1, поэтому следует сохранить. Мы видим, что идентификаторы 2 и 3 имеют 0 в строках 9, 10 и 14, 15 для var1 и поэтому должны быть удалены. Если мы посмотрим на идентификатор 16, он имеет все 0 для var1 и должен быть полностью удален из нового фрейма данных. Так что просто для пояснения, 0 в var1 - это хорошо, если они не являются последними значениями для каждого уровня идентификатора, если они есть, строки, содержащие их, должны быть удалены независимо от того, сколько строк мы говорим. Новый фрейм данных должен выглядеть следующим образом.

   ID var1
1   1    0
2   1    3
3   1    0
4   1    3
5   1    1
6   2    0
7   2    0
8   2    1
9   3    1
10  3    0
11  3    2

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Попробуйте:

library(dplyr)

df %>%
  group_by(ID) %>%
  filter(!(var1 == 0 & cumsum(var1 != 0) == max(cumsum(var1 != 0))))

Вывод:

# A tibble: 11 x 2
# Groups:   ID [3]
      ID  var1
   <int> <int>
 1     1     0
 2     1     3
 3     1     0
 4     1     3
 5     1     1
 6     2     0
 7     2     0
 8     2     1
 9     3     1
10     3     0
11     3     2

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

1 голос
/ 27 апреля 2020

Опция с использованием data.table:

DT[-DT[, {
    ri <- rleid(var1)
    .I[var1==0L & ri==ri[.N]]
}, ID]$V1]

Выход:

    ID var1
 1:  1    0
 2:  1    3
 3:  1    0
 4:  1    3
 5:  1    1
 6:  2    0
 7:  2    0
 8:  2    1
 9:  3    1
10:  3    0
11:  3    2

данные:

library(data.table)
DT <- fread("ID var1
1    0
1    3
1    0
1    3
1    1
2    0
2    0
2    1
2    0
2    0
3    1
3    0
3    2
3    0
3    0")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...