什么你基本上想要做的就是分配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
-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
而且,你还可以使用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]
这工作。让我更多地关注我的数据。我非常感谢你的协助。也管理完成二进制化。 – user7845625