Как создать двоичную переменную на основе изменений в другом столбце? - PullRequest
0 голосов
/ 11 июля 2019

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

structure(list(ID = c(30767L, 30767L, 30767L, 30767L, 30767L, 
30767L, 30767L, 30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 
30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 
30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 
30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 30759L, 
30759L, 30759L, 30759L), shore = c("West", "West", "West", "West", 
"West", "West", "West", "West", "West", "West", "West", "West", 
"East", "West", "East", "East", "West", "West", "West", "West", 
"West", "West", "West", "West", "West", "West", "East", "West", 
"West", "West", "West", "West", "East", "East", "East", "East", 
"East", "East", "East", "East")), row.names = c(NA, -40L), groups = structure(list(
    ID = c(30759L, 30767L), .rows = list(8:40, 1:7)), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

По сути, сначала я хочу идентифицировать отсутствие изменений как - движение Запад-Восток как 0 и движение Восток-Запад как 1 .. См. Пример ниже.

      ID Shore Direction
1  30759  West         -
2  30759  West         -
3  30759  West         -
4  30759  East         0
5  30759  West         1
6  30759  East         0
7  30759  East         -
8  30759  West         1
9  30759  West         -
10 30759  West         -

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вот один из способов, используя dplyr:

df %>% 
  dplyr::mutate(prev = lag(shore),
                direction = dplyr::case_when(shore == "West" & prev == "East" ~ 1,
                                             shore == "East" & prev == "West" ~ 0,
                                             TRUE ~ NA_real_))

Функция lag() дает предыдущую запись (в данном случае) столбца shore.Затем я добавил столбец направления, который равен 1, когда направление меняется с востока на запад, 0, когда направление меняется с запада на восток, и NA в противном случае.Затем вы можете удалить столбец prev.

1 голос
/ 11 июля 2019

Группируйте по ID, а затем используйте case_when с lag для вычисления переменной.

library(dplyr)

DF %>%
  group_by(ID) %>%
  mutate(dir = case_when(
    shore == "West" & lag(shore) == "East" ~ 1L,
    shore == "East" & lag(shore) == "West" ~ 0L,
    TRUE ~ NA_integer_)) %>%
  ungroup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...