Последовательности интеллектуального анализа данных из строк фрейма данных

долгое время искатель ответов, впервые задающий вопрос. У меня есть фрейм данных R, который представляет собой один столбец, 267 000 строк с 17 факторами, например:

regions
VE
PU
PR
DE
NU
AD
DE
NO
AD

Я пытаюсь извлечь их как последовательности столбцов с длиной 2 и 3, затем спуститься на 1 строку и повторить до конца. повторяет и заказывает настоящее. Я хочу взять вышеизложенное и сделать так:

s1   s2
VE   PU
PU   PR
PR   DE
DE   NU
NU   AD
AD   DE
DE   NO

Я пытался использовать такие пакеты, как TraMinEr и ArulesSequences, но не могу в них разобраться. Я думаю, это потому, что мои последовательности являются чисто состояниями, к ним не прикреплена временная информация, даже в исходном наборе данных. Я также пытался создать свои собственные сценарии итераторов, но не смог. Я бесконечно гуглил, и я просто в тупике. Я не знаю, как это сделать. конечная цель состоит в том, чтобы сопоставить выходные данные с фреймом данных перестановки 2 или 3 и бинаризировать совпадения с 1, 0 для отсутствия совпадений и обработать этот x49 в новый фрейм данных.

Я не эксперт в программировании или R, просто начинающий пользователь. Кто-нибудь знает скрипт или пакет, который может это сделать?


person user7845625    schedule 10.04.2017    source источник


Ответы (2)


Что вы в основном хотите сделать, так это назначить regions без последнего наблюдения s1 и regions без первого наблюдения s2. Для этого вам не обязательно нужны дополнительные пакеты. Существует несколько подходов:

1) Использование функций head и tail

С их помощью вы можете получить векторы без последнего наблюдения (head(column, -1)) или без первого наблюдения (tail(column, -1)).

С использованием:

new.df <- data.frame(s1 = head(df$regions,-1), s2 = tail(df$regions,-1))

Таким образом, вы получите:

> new.df
  s1 s2
1 VE PU
2 PU PR
3 PR DE
4 DE NU
5 NU AD
6 AD DE
7 DE NO
8 NO AD

Если вам нужны три столбца, вы можете сделать:

new.df <- data.frame(s1 = head(df$regions,-2), 
                     s2 = head(tail(df$regions,-1),-1),
                     s3 = tail(df$regions,-2))

что приводит к:

> new.df
  s1 s2 s3
1 VE PU PR
2 PU PR DE
3 PR DE NU
4 DE NU AD
5 NU AD DE
6 AD DE NO
7 DE NO AD

2) базовое подмножество

В качестве альтернативы функциям head и tail вы также можете использовать базовое подмножество:

new.df <- data.frame(s1 = df$regions[-nrow(df)], 
                     s2 = df$regions[-1])

3) с помощью функции embed

n <- 3
new.df <- data.frame(embed(df$regions, n)[,n:1])
names(new.df) <- paste0('s',1:n)

который дает:

> new.df
  s1 s2 s3
1 VE PU PR
2 PU PR DE
3 PR DE NU
4 DE NU AD
5 NU AD DE
6 AD DE NO
7 DE NO AD

4) используя функцию shift из пакета data.table

Функция shift из пакета data.table также может быть опцией:

library(data.table)
dt <- as.data.table(df)
new.dt <- na.omit(dt[, .(s1 = regions,
                         s2 = shift(regions, 1, NA, 'lead'),
                         s3 = shift(regions, 2, NA, 'lead'))])

И вместо na.omit вы также можете использовать rowSums для is.na:

new.dt <- dt[, .(s1 = regions,
                 s2 = shift(regions, 1, NA, 'lead'),
                 s3 = shift(regions, 2, NA, 'lead'))]

new.dt[rowSums(is.na(new.dt))==0]
person Jaap    schedule 10.04.2017
comment
Это сработало. Заставил меня больше думать о моих данных как о множествах. Я очень ценю вашу помощь. Удалось завершить бинаризацию тоже. - person user7845625; 14.04.2017

Вы также можете использовать transmute и lead в пакете dplyr:

df1 <-read.table(text="regions
VE
PU
PR
DE
NU
AD
DE
NO
AD",header=TRUE, stringsAsFactors=FALSE)

library(dplyr)
df1 %>% transmute(s1=regions,s2=lead(regions)) %>%na.omit

  s1 s2
1 VE PU
2 PU PR
3 PR DE
4 DE NU
5 NU AD
6 AD DE
7 DE NO
8 NO AD

Если вам нужны последовательности из 3, вы можете добавить еще столбцы с lead(regions,2)

df1 %>% transmute(s1=regions,s2=lead(regions),s3=lead(regions,2)) %>%na.omit
  s1 s2 s3
1 VE PU PR
2 PU PR DE
3 PR DE NU
4 DE NU AD
5 NU AD DE
6 AD DE NO
7 DE NO AD
person Pierre Lapointe    schedule 10.04.2017