2017-04-10 74 views
3

長時間的答案搜索者,第一次提問者。我有一個R數據幀是單個列,267000行與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 

我使用像佔美娜和ArulesSequences包試過,但我不出來。我認爲這是因爲我的序列純粹是狀態,沒有附加時間信息,即使在源數據集中也沒有。我也嘗試製作自己的迭代器腳本,但我無法成功。我已經無休止地Google搜索了,而且我只是處於有利的位置。我不知道該怎麼做。最終的目標是將輸出與2或3置換數據幀進行匹配,並且在不匹配的情況下將二進制匹配與1,0匹配,並將該x49處理成新的數據幀。

我不是編程或R的專家,只是一個新手用戶。有沒有人知道可以做到這一點的腳本或包?

回答

3

什麼你基本上想要做的就是分配regions沒有最後觀察s1regions沒有第一觀察s2。你不一定需要額外的軟件包。有幾種方法:

1)使用headtail功能

有了這些,你可以得到沒有最後的觀察(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)基本子集

作爲替代的headtail函數,則也可以使用基本的子集:

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 -function從data.table -package

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而且,你還可以使用rowSumsis.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

這工作。讓我更多地關注我的數據。我非常感謝你的協助。也管理完成二進制化。 – user7845625

3

你也可以在包dplyr使用transmutelead

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