2017-04-10 5 views
3

chercheur de longue durée, premier demandeur de questions. J'ai une trame de données de R qui est une seule colonne, 267.000 lignes avec des 17 facteurs, comme suit:Séquences de minage à partir des lignes de la trame de données

regions 
VE 
PU 
PR 
DE 
NU 
AD 
DE 
NO 
AD 

Je tente d'extraire ceux-ci en tant que séquences de colonnes, avec des longueurs de 2 et 3, puis déplacer vers le bas par 1 rang et répétez jusqu'à la fin. répète et ordonne présent. Je veux prendre ce qui précède, et la faire ressembler à ceci:

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

J'ai essayé d'utiliser des paquets comme Traminer et ArulesSequences, mais je ne peux pas les comprendre. Je pense que c'est parce que mes séquences sont purement états, il n'y a pas d'informations temporelles attachées, pas même dans l'ensemble de données source. J'ai aussi essayé de créer mes propres scripts d'itérateur, mais je n'ai pas réussi. J'ai googlé à l'infini, et je suis juste à la fin de l'esprit. Je ne sais pas comment faire ça. l'objectif final est de faire correspondre les sorties avec une trame de données de permutation de 2 ou 3, et binarize correspond à 1, 0 pour aucune correspondance, et de traiter cette x49 dans une nouvelle trame de données.

Je ne suis pas un expert en programmation ou R, juste un utilisateur novice. Est-ce que quelqu'un connaît un script ou un paquet qui peut le faire?

Répondre

3

Ce que vous voulez faire est essentiellement à attribuer regions sans la dernière observation à s1 et regions sans la première observation à s2. Vous n'avez pas nécessairement besoin de paquets supplémentaires pour cela. Il existe plusieurs approches:

1) Utilisation des head et tail fonctions

Avec ces derniers vous pouvez obtenir des vecteurs sans la dernière observation (head(column, -1)) ou sans la première observation (tail(column, -1)).

utilisant:

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

va donc vous obtenez:

> 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 

Si vous voulez trois colonnes, vous pouvez faire:

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

qui se traduit par:

> 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) subsetting base

Comme alternative aux head et tail fonctions, vous pouvez aussi utiliser subsetting de base:

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

3) en utilisant la embed -fonction

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

qui donne:

> 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) en utilisant le shift -fonction de la data.table -package

La fonction shift de l'emballage data.table pourrait également être un option:

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'))]) 

Et au lieu de na.omit, vous pouvez également utiliser rowSums sur 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] 
+1

Cela a fonctionné. Cela m'a fait penser davantage à mes données en tant que sets. J'apprécie grandement votre aide. Géré pour compléter la binarisation aussi. – user7845625

3

Vous pouvez également utiliser transmute et lead dans le paquet 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 

Si vous vouliez des séquences de 3, vous pouvez ajouter d'autres colonnes avec 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