在R中创建增长系列

时间:2016-10-19 18:17:21

标签: r

考虑MASS包中的Loblolly数据集。

head(Loblolly)
    height age Seed
1    4.51   3  301
15  10.89   5  301
29  28.72  10  301
43  41.74  15  301
57  52.70  20  301
71  60.92  25  301

对于每个种子,我想创建新变量height1,age1和height2,age2。输出类似于...

height1 age1 height2 age2 Seed
4.51      3    10.89    5  301
10.89     5    28.72   10  301
28.72    10    41.74   15  301

请原谅我,如果之前有人询问过,但我一直在寻找并找不到类似的东西。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你应该可以这样做:

# get data frame length
n <- dim(Loblolly)[1]

df <- NULL

# combine appropriate vectors
df$height1 <- Loblolly$height[1:(n-1)]
df$age1    <- Loblolly$age[1:(n-1)]
df$height2 <- Loblolly$height[2:n]
df$age2    <- Loblolly$age[2:n]
df$Seed    <- Loblolly$Seed[1:(n-1)]

# flatten list as data.frame
head(data.frame(df))

答案 1 :(得分:0)

这是一个基础R方法,它将通过Seed给出每个观察的“领先”。

myList <- split(Loblolly, Loblolly$Seed)
myList <- lapply(myList, function(x) setNames(cbind(head(x, -1), tail(x, -1)),
                                   paste0(names(Loblolly), rep(1:2, each=length(Loblolly)))))

dfNew <- do.call("rbind", myList)

返回数据的样本是

head(dfNew, 10)
       height1 age1 Seed1 height2 age2 Seed2
329.13    3.93    3   329    9.34    5   329
329.27    9.34    5   329   26.08   10   329
329.41   26.08   10   329   37.79   15   329
329.55   37.79   15   329   48.31   20   329
329.69   48.31   20   329   56.43   25   329
327.12    4.12    3   327    9.92    5   327
327.26    9.92    5   327   26.54   10   327
327.40   26.54   10   327   37.82   15   327
327.54   37.82   15   327   48.43   20   327
327.68   48.43   20   327   56.81   25   327