Как я могу удалить строки, которые имеют два или более слов (после друг друга) в последовательности? - PullRequest
0 голосов
/ 13 мая 2019

Я хочу удалить строки, которые имеют одинаковые два или более слов друг за другом, как последовательность. Это делается для последовательного анализа паттернов.

Я уже попробовал функцию distinct() и duplicated(), но это только удаляет весь ряд.

r_seq_5 <- r_seq_5[!duplicated(r_seq_5),] # remove duplicates


   #       Su Score result ROI       next_roi  third_roi  four_roi   five_roi   
   #  1     1    90 high   Elsewhere Elsewhere Teacher    Teacher    Teacher   
   #  2     1    90 high   Elsewhere Teacher   Teacher    Teacher    Teacher   
   #  3     1    90 high   Teacher   Pen       Teacher    Elsewhere  Smartboard

Это таблица. Если Учитель встречается в предложении два или три раза, это не имеет значения, если только они не следуют друг за другом.

Желаемый результат:

# 1     1    90 high   Teacher   Pen       Teacher    Elsewhere  Smartboard

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Для этого мне было удобно превращать коэффициенты в числа. И это был мой первый шаг, потому что сравнивать мачту столбцов этот путь кажется менее трудным.

Для этого я использовал for, пакет qdap, потому что в macth я заменил значения на NA.

library(dplyr)
library(qdap)
df <- data.frame(Su = rep(1,3),
                 Score = rep(90,3),
                 ROI = c("A", "A", "B"),
                 NETX_ROI = c("A", "B", "C"),
                 third_roi = rep("B", 3),
                 four_roi = c("B", "B", "A"),
                 five_roi = c("B", "B", "D"))
df
> df
  Su Score ROI NETX_ROI third_roi four_roi five_roi
1  1    90   A        A         B        B        B
2  1    90   A        B         B        B        B
3  1    90   B        C         B        A        D
df2 <- df
roi <- c("A", "B", "C", "D")
# A = Elsewhere
# B = Teacher
# C = Pen
# D = Smartboard

n <- seq(1, length.out = length(roi))
for (i in 1:length(n)) {
  df2[df2 == roi[i]] <- NA
  df2 <- qdap::NAer(df2, i)
}
> df2
  Su Score ROI NETX_ROI third_roi four_roi five_roi
1  1    90   1        1         2        2        2
2  1    90   1        2         2        2        2
3  1    90   2        3         2        1        4
df2 <- df2 %>% 
  dplyr::select(-c(Su, Score)) %>% 
  as.matrix()

nn <- ncol(df2)
x  <- matrix(nrow = nrow(df2), ncol = ncol(df2)-1)
for (i in 1:(nn-1)) {
  xx <- ifelse(df2[,i] == df2[,i+1], NA, 0)
  x[,i] <- as.matrix(xx)
}
> x
     [,1] [,2] [,3] [,4]
[1,]   NA    0   NA   NA
[2,]    0   NA   NA   NA
[3,]    0    0    0    0

Наконец, я просто удалил строки с помощью NA.

dfx <- x %>% 
  as.data.frame()

df_test <- df %>% 
  dplyr::bind_cols(dfx) %>% 
  na.omit() %>% 
  dplyr::select(1:ncol(df))
df_test
> df_test
  Su Score ROI NETX_ROI third_roi four_roi five_roi
3  1    90   B        C         B        A        D
0 голосов
/ 13 мая 2019

Вы можете использовать gather() для того, чтобы перегруппировать вашу переменную, а затем построить цикл, чтобы идентифицировать в значении то же, что и предыдущий.

Наконец, используйте spread() для восстановленияваша первоначальная структура.

df <- data.frame(
  row = 1:4,
  Su = 1,
  Score = 90,
  result = 'high',
  ROI  = c('A', 'A', 'B', 'A'),
  ROI2 = c('A', 'B', 'C', 'B'),
  ROI3 = c('B', 'B', 'A', 'C')
) %>% 
  gather(-(row:result), key = roi, value = value) %>% 
  arrange(row) %>% 
  mutate(repeated = 0)

for(i in 2:nrow(df)){
  if(df$row[i] == df$row[i-1] & df$value[i] == df$value[i-1])
    df$repeated[i] = 1
}

df %>% 
  group_by(row) %>% 
  mutate(repeated = sum(repeated)) %>% 
  filter(repeated == 0) %>% 
  select(-repeated) %>% 
  spread(key = roi, value = value)

#     row    Su Score result ROI   ROI2  ROI3 
#   <int> <dbl> <dbl> <fct>  <chr> <chr> <chr>
# 1     3     1    90 high   B     C     A    
# 2     4     1    90 high   A     B     C 
...