Выведите «NA» в новый столбец, если строковые значения совпадают с предыдущей строкой - PullRequest
0 голосов
/ 23 декабря 2018

Используя R, я пытаюсь добавить новый столбец в набор данных, который дублирует столбец слева, заменяя строковые значения на «NA», когда строка идентична строке выше.

Это, вероятно, лучше всего объяснить некоторыми данными.Мой набор данных в настоящее время выглядит так:

   x.id x.timestamp x.action
71    1  1435114605   click
72    1  1435114606   click
73    1  1435114659   click
74    1  1435114719  scroll
75    1  1435114726  scroll
76    1  1435114780  scroll
77    1  1435155998  scroll
78    1  1435156059  scroll
79    1  1435156076   click
80    1  1435156119   click

И вывод, который я пытаюсь получить, таков:

   x.id x.timestamp x.action x.mutate
71    1  1435114605   click   click
72    1  1435114606   click      NA
73    1  1435114659   click      NA
74    1  1435114719  scroll  scroll
75    1  1435114726  scroll      NA
76    1  1435114780  scroll      NA
77    1  1435155998  scroll      NA
78    1  1435156059  scroll      NA
79    1  1435156076  scroll   click
80    1  1435156119  scroll      NA

Как видите, правая колонка заменяет дубликатыс "NA".Однако, поскольку те же значения повторяются позже, я не могу просто использовать дублированные или уникальные функции.

Предыдущие попытки

  1. Это очень похоже на эту проблему, и я попыталсячто-то в том же духе, но так как это символы, а не цифры, это дало мне ошибку: Удалить всю строку, если значение в значении равно предыдущей строке в R

  2. Затем я попытался выполнить показ цикла for ниже, но получил эту ошибку: «Ошибка в метке времени [[i]]: объект типа« замыкание »не является подмножеством»

    for(i in 1:length(timestamp))
     {
    if (timestamp[[i]] == min(timestamp)) event_type[[i]] <- event_type[[i]]
    else if(event_type[[i + 1]] == event_type[[i]]) event_type[[i + 1]] <- "NA"
    else if(event_type[[i + 1]] != event_type[[i]]) event_type[[i + 1]] <- event_type[[i + 1]]
     }
    

Есть идеи, как создать дополнительный столбец "x.mutate" для второго набора данных, показанного выше?Я немного растерялся, любая помощь очень ценится: -)

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

1) rleid / ave Используя данные, воспроизводимые в примечании в конце, и используя rleid в пакете data.table, мы определяем функцию x1_na, которая заменяет все элементыего векторный аргумент с NA кроме первого и затем применяет его с ave:

library(data.table)

x1_na <- function(x) `length<-`(x[1], length(x))
transform(DF, x.mutate = ave(x.action, rleid(x.action), FUN = x1_na))

, давая:

   x.id x.timestamp x.action x.mutate
71    1  1435114605    click    click
72    1  1435114606    click     <NA>
73    1  1435114659    click     <NA>
74    1  1435114719   scroll   scroll
75    1  1435114726   scroll     <NA>
76    1  1435114780   scroll     <NA>
77    1  1435155998   scroll     <NA>
78    1  1435156059   scroll     <NA>
79    1  1435156076    click    click
80    1  1435156119    click     <NA>

2) rleid / duplicated A вариацияиз вышеперечисленного будет:

transform(DF, x.mutate = replace(x.action, duplicated(rleid(x.action)), NA))

3) Base R Единственная неосновная часть из вышеперечисленного - rleid, поэтому, если вам нужно решение Base R, используйте один извыше, но определите rleid самостоятельно так:

rleid <- function(x) with(rle(x), rep(seq_along(lengths), lengths))

Примечание

Мы предполагаем, что вводом является следующее, показанное в воспроизводимой форме.В частности, обратите внимание, что последний столбец является символом (как указано в вопросе в разделе «Предыдущие попытки»).

Lines <- "
   x.id x.timestamp x.action
71    1  1435114605   click
72    1  1435114606   click
73    1  1435114659   click
74    1  1435114719  scroll
75    1  1435114726  scroll
76    1  1435114780  scroll
77    1  1435155998  scroll
78    1  1435156059  scroll
79    1  1435156076   click
80    1  1435156119   click"
DF <- read.table(text = Lines, as.is = TRUE)
0 голосов
/ 23 декабря 2018

Если вы добавляете FALSE (поскольку первый элемент никогда не является последовательным дубликатом) в качестве первого элемента к вектору равенств head и tail, это можно использовать в тестовом векторе для is.na<-.Функция is.na<- использует логический вектор RHS оператора присваивания, чтобы указать, какие записи в векторе внутри скобок переназначаются на NA:

 dfrm$mutate <- dfrm$x.action  # Make copy to modify
 is.na( dfrm$mutate) <- c(FALSE, head(dfrm$x.action,-1)==tail(dfrm$x.action,-1) )

dfrm
       x.id x.timestamp x.action mutate
71    1  1435114605    click  click
72    1  1435114606    click   <NA>
73    1  1435114659    click   <NA>
74    1  1435114719   scroll scroll
75    1  1435114726   scroll   <NA>
76    1  1435114780   scroll   <NA>
77    1  1435155998   scroll   <NA>
78    1  1435156059   scroll   <NA>
79    1  1435156076    click  click
80    1  1435156119    click   <NA>
0 голосов
/ 23 декабря 2018

С помощью dplyr вы можете сделать:

df %>%
 mutate(res = ifelse(x.action == lag(x.action) & row_number() != min(row_number()), NA, x.action))

   x.id x.timestamp x.action    res
1     1  1435114605    click  click
2     1  1435114606    click   <NA>
3     1  1435114659    click   <NA>
4     1  1435114719   scroll scroll
5     1  1435114726   scroll   <NA>
6     1  1435114780   scroll   <NA>
7     1  1435155998   scroll   <NA>
8     1  1435156059   scroll   <NA>
9     1  1435156076    click  click
10    1  1435156119    click   <NA>

Или в упрощенном виде (как предложено @Konrad Rudolph):

df %>%
 mutate(res = ifelse(x.action == lag(x.action, default = ""), NA, x.action))

Это просто сравнивает "x".action "имеет то же значение, что и предыдущая" x.action ".Для первой строки он просто присваивает свое значение из "x.action".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...