Как удалить смещенные строки в таблице?
Я пытаюсь удалить строки, имеющие значения смещения.
library(dplyr)
a <- c(1, 1, 1, 1, 2, 2, 2, 2,2,2)
b <- c("a", "b", "b", "b", "c", "c","c", "d", "d", "d")
d <- c(10, 10, -10, 10, 20, -20, 20, 30, -30, 30)
o <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
df <- tibble(ID = a, SEQ = b, VALUE = d, OTHER = o)
Создает эту упорядоченную таблицу, которая сгруппирована по ID и SEQ.
> df
# A tibble: 10 x 4
ID SEQ VALUE OTHER
<dbl> <chr> <dbl> <chr>
1 1 a 10 A
2 1 b 10 B
3 1 b -10 C
4 1 b 10 D
5 2 c 20 E
6 2 c -20 F
7 2 c 20 G
8 2 d 30 H
9 2 d -30 I
10 2 d 30 J
Я хочу отбросить пары строк (2,3), (5,6), (8,9), потому что VALUE отрицает VALUE в соответствующей предыдущей строке.
Я хочу, чтобы полученная таблица была
> df2
# A tibble: 4 x 4
ID SEQ VALUE OTHER
<dbl> <chr> <dbl> <chr>
1 1 a 10 A
2 1 b 10 D
3 2 c 20 G
4 2 d 30 J
Я знаю, что я не могу использовать group_by %>% summarize
, потому что мне нужно сохранить значение, которое находится в ДРУГОЙ. Я посмотрел на dplyr::lag()
функционировать, но я не понимаю, как это может помочь. Я считаю, что я мог бы перебрать таблицу с каким-то типом for each
цикл и генерировать логический вектор, который можно использовать для удаления строк, но я надеялся на более элегантное решение.
2 ответа
Как насчет:
vec <- cbind(
c(head(df$VALUE,-1) + df$VALUE[-1], 9999) ,
df$VALUE + c(9999, head(df$VALUE,-1))
)
vec <- apply(vec,1,prod)
vec <- vec!=0
df[vec,]
# A tibble: 4 x 4
ID SEQ VALUE OTHER
<dbl> <chr> <dbl> <chr>
1 1 a 10 A
2 1 b 50 D
3 2 c 60 G
4 2 d 70 J
Идея состоит в том, чтобы взять VALUE
поле и вычесть его с немного подмножеством его версии. Когда результат равен 0, тогда вы удаляете строку.
Вот еще одно решение с dplyr
, Не уверен насчет крайнего случая, который вы упомянули в комментариях, но не стесняйтесь проверить его с моим решением:
library(dplyr)
df %>%
group_by(ID, SEQ) %>%
mutate(diff = VALUE + lag(VALUE),
diff2 = VALUE + lead(VALUE)) %>%
mutate_at(vars(diff:diff2), funs(coalesce(., 1))) %>%
filter((diff != 0 & diff2 != 0)) %>%
select(-diff, -diff2)
Результат:
# A tibble: 4 x 4
# Groups: ID, SEQ [4]
ID SEQ VALUE OTHER
<dbl> <chr> <dbl> <chr>
1 1 a 10 A
2 1 b 50 D
3 2 c 60 G
4 2 d 70 J
Замечания:
Это решение сначала создает два diff
столбцы, добавив один lag
еще одно добавление lead
из VALUE
для каждого VALUE
, Только столбцы смещения будут иметь ноль в diff
или в diff2
, поэтому я отфильтровал эти строки, в результате чего желаемый результат.