Удалить строку из фрейма данных R на основе значений отдельных ячеек - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь использовать R для выделения значений в одном столбце в кадре данных, затем сравниваю значение строки n с строкой n-1. Если строка n равна строке n-1, я хочу удалить эту строку. Например:

ID   Time1   Time2
1    6       7
2    5       8
3    5       9
4    6       6

Для этого примера сфокусируйтесь только на столбце Time1. Я хочу удалить наблюдение 3, потому что значение Time1 в этом наблюдении такое же, как в наблюдении 2. Однако я НЕ хочу удалять наблюдение 4, даже если значение Time1 здесь такое же, как в наблюдении 1. I нужно сосредоточиться строго на сравнении наблюдения n и наблюдения n-1, а не любых других, которые предшествуют этому. Есть ли простой способ сделать эту работу в R? Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Вы можете добавить лаг Time1 к кадру данных, а затем отфильтровать строки, где Time1 == Time1_lag.

Вот как вы можете сделать это только с базовым R:

df <- data.frame(ID = 1:4, Time1 = c(6, 5, 5, 6), Time2 = c(7, 8, 9, 6))
# Remove the last observation and put an NA for the first one to create the lag
df$Time1_lag <- c(NA, df$Time1[-nrow(df)])
# need to worry about the NA in the first row, so add an extra condition
df[df$Time1 != df$Time1_lag | is.na(df$Time1_lag), ]

Вот как вы можете сделать это с пакетом dplyr:

library(dplyr)
df <- data.frame(ID = 1:4, Time1 = c(6, 5, 5, 6), Time2 = c(7, 8, 9, 6))
df %>% mutate(Time1_lag = lag(Time1)) %>% filter(Time1 != Time1_lag | is.na(Time1))
0 голосов
/ 25 апреля 2018

Объяснение кода в комментариях

df[!c(TRUE, diff(df$Time1)) == 0, ]

Работа наизнанку

diff(df$Time1)    # difference between x+1 & x position
# -1  0  1
# [5 - 6] [5- 5] [6 -5]

c(TRUE, diff(df$Time1))  # concatenates TRUE to front of numerical vector
# TRUE -1 0 1

c(TRUE, diff(df$Time1)) == 0
# FALSE FALSE TRUE FALSE

!c(TRUE, diff(df$Time1)) == 0   # negate logical
# TRUE TRUE FALSE TRUE

df[!c(TRUE, diff(df$Time1)) == 0, ] # subset rows that are true
0 голосов
/ 25 апреля 2018

Опция, использующая dplyr:

library(dplyr)
df %>% dfplyr::filter( Time1 != lag(Time1, default = -Inf))

#   ID Time1 Time2
# 1  1     6     7
# 2  2     5     8
# 3  4     6     6

Данные:

df <- read.table(text = 
"ID   Time1   Time2
1    6       7
2    5       8
3    5       9
4    6       6",
header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...