什麼你基本上想要做的就是分配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