考虑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
请原谅我,如果之前有人询问过,但我一直在寻找并找不到类似的东西。
答案 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