2017-04-10 71 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