Как определить ячейку, содержащую строку и следующие 2 ячейки после этого в r данных? - PullRequest
1 голос
/ 20 января 2020

Мне интересно, как я могу обнаружить некоторую строку из фрейма данных R и следующих 2 (или n) ячеек после этой ячейки из той же строки. И после обнаружения моей целью было бы получить индикаторную переменную из этих 3 ячеек.

Намного проще показать, что я имею в виду, приведя пример. Допустим, мой фрейм данных выглядит следующим образом

table <-  data.frame( x1 = c(1,4,6,"Y"), x2 = c("Y",1,"Y",5), x3 = c(1,2,5,4),
                     x4 = c(2,NA,4,"Y"), x5 = c(NA,NA,6,1), x6 = c(NA,NA,1,5))
x1 x2 x3 x4 x5 x6
1  Y  1  2 NA NA
4  1  2  NA NA NA
6  Y  5  4  6  1
Y  5  4  Y  1  5

И целью будет таблица, которая выглядит примерно так

goal_table <- data.frame(Y12 = c(1,0,0,0),Y54 = c(0,0,1,1), Y15 = c(0,0,0,1))

Y12 Y54 Y15
1   0   0
0   0   0
0   1   0
0   1   1

Так как в исходной таблице первая строка содержит ячейку «Y», за которыми следуют «1» и «2», тогда в таблице целей будет столбец «Y12» с индикатором 1 и применяется тот же лог c ко всем двум другим комбинациям чисел, которые идут после «Y».

Некоторая информация, которая может упростить эту задачу: за Y всегда следуют как минимум два числа. Если в строке содержится NA, скажем, x2, то каждый последующий x3, x4, x5, ... также будет NA (как видно из примера). Таблица целей не обязательно должна быть собственной, столбцы можно просто добавить в исходную таблицу.

1 Ответ

1 голос
/ 20 января 2020

Вот один вариант с tidyverse

library(dplyr)
library(tidyr)
library(stringr)
table %>% 
   mutate_all(as.character) %>% 
   mutate(rn = row_number()) %>%
   pivot_longer(cols = -rn, values_drop_na = TRUE) %>% 
   group_by(rn) %>% 
   group_by(grp = cumsum(value == 'Y'), add = TRUE) %>%
   summarise(value = str_c(head(value, 3), collapse="")) %>% 
   filter(str_detect(value, '^Y')) %>% 
   ungroup %>%
   select(-grp) %>%
   mutate(new = 1) %>%
   group_by(rn) %>%
   mutate(rn2 = row_number()) %>%
   ungroup %>%
   pivot_wider(names_from = value, values_from = new, 
           values_fill = list(new = 0)) %>%
   select(-rn, - rn2)
# A tibble: 4 x 3
#    Y12   Y54   Y15
#  <dbl> <dbl> <dbl>
#1     1     0     0
#2     0     1     0
#3     0     1     0
#4     0     0     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...