从数据框行挖掘序列

时间:2017-04-10 15:29:19

标签: r dataframe sequence arules traminer

长时间的应答者,第一次提问。我有一个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这样的软件包,但我无法解决这些问题。我认为这是因为我的序列纯粹是状态,没有附加时间信息,甚至在源数据集中也没有。我也尝试制作自己的迭代器脚本,但我无法成功。我无休止地用Google搜索,我只是在斗智斗勇。我不知道该怎么做。最终的目标是将输出与2或3个置换数据帧进行匹配,并将匹配的二进制数与1,0进行无匹配,并将x49处理为新的数据帧。

我不是编程专家或R,只是新手用户。有没有人知道可以做到这一点的脚本或包?

2 个答案:

答案 0 :(得分:3)

您基本上想要做的是在regionss1没有最后一次观察的情况下将regions分配给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 - {/ strong>

中的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]

答案 1 :(得分:3)

您还可以在transmute包中使用leaddplyr

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