长时间的应答者,第一次提问。我有一个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,只是新手用户。有没有人知道可以做到这一点的脚本或包?
答案 0 :(得分:3)
您基本上想要做的是在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
- {/ 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
包中使用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