我有以下数据框。
date id value
2012-01-01 1 0.3
2012-01-01 2 0.5
2012-01-01 3 0.2
2012-01-01 4 0.8
2012-01-01 5 0.2
2012-01-01 6 0.8
2012-01-01 7 0.1
2012-01-01 8 0.4
2012-01-01 9 0.3
2012-01-01 10 0.2
有几个日期,对于每个日期,我都有10个id值(如上所示)和一个value字段。我想做的是为每个id在“值”字段中找到前n个值。例如,如果n = 3,那么我希望输出如下。
date id value value1 value2 value3
2012-01-01 1 0.3 NA NA NA
2012-01-01 2 0.5 NA NA NA
2012-01-01 3 0.2 NA NA NA
2012-01-01 4 0.8 0.2 0.5 0.3
2012-01-01 5 0.2 0.8 0.2 0.5
...
有没有简单的方法可以通过plyr或使用mapply做到这一点?在此先感谢。
最佳答案
您可以使用基本函数轻松完成此操作:
id <- 1:10
value <- c(0.3,0.5,0.2,0.8,0.2,0.8,0.1,0.4,0.3,0.2)
test <- data.frame(id,value)
test$valprev1 <- c(rep(NA,1),head(test$value,-1))
test$valprev2 <- c(rep(NA,2),head(test$value,-2))
test$valprev3 <- c(rep(NA,3),head(test$value,-3))
结果
id value valprev1 valprev2 valprev3
1 1 0.3 NA NA NA
2 2 0.5 0.3 NA NA
3 3 0.2 0.5 0.3 NA
4 4 0.8 0.2 0.5 0.3
5 5 0.2 0.8 0.2 0.5
6 6 0.8 0.2 0.8 0.2
7 7 0.1 0.8 0.2 0.8
8 8 0.4 0.1 0.8 0.2
9 9 0.3 0.4 0.1 0.8
10 10 0.2 0.3 0.4 0.1
以前在这里犯了一个错误-这是函数中的
sapply
版本:prevrows <- function(data,n) {sapply(1:n,function(x) c(rep(NA,x),head(data,-x)))}
prevrows(test$value,3)
这给出了这样的:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] 0.3 NA NA
[3,] 0.5 0.3 NA
[4,] 0.2 0.5 0.3
[5,] 0.8 0.2 0.5
[6,] 0.2 0.8 0.2
[7,] 0.8 0.2 0.8
[8,] 0.1 0.8 0.2
[9,] 0.4 0.1 0.8
[10,] 0.3 0.4 0.1
然后可以将其应用于数据中的每个日期集,如下所示:
result <- tapply(test$value,test$date,prevrows,3)
其中列出了每个日期集的一堆列表。您可以使用以下方法对它们进行行绑定(bind)以添加回您的数据集中:
data.frame(test,do.call(rbind,result))
关于r - 获取数据帧中的前n行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10793873/