R 使用日期序列展开函数中的数据帧
我试图获取一个数据帧,并将其扩展为函数中的面板数据R 使用日期序列展开函数中的数据帧,r,plyr,lubridate,R,Plyr,Lubridate,我试图获取一个数据帧,并将其扩展为函数中的面板数据 require(lubridate) require(plyr) df <- data.frame(group = seq(1, 10)) f <- function(df, sdate, edate) { df <- ddply(df, .(group), transform, year = year(seq(ymd(sdate), ymd(edate), by = "year"))) return(df) }
require(lubridate)
require(plyr)
df <- data.frame(group = seq(1, 10))
f <- function(df, sdate, edate) {
df <- ddply(df, .(group), transform, year = year(seq(ymd(sdate), ymd(edate), by = "year")))
return(df)
}
f(df, "1945-1-1", "2013-1-1")
这会引发错误:lapplylist中出现错误…,.num_to_date from 3:找不到对象'sdate'
似乎sdate和edate传递正确,并且在函数中具有正确的类型 这就是范围界定的问题。 以下是一个解决方法:
> f <- function(df, sdate, edate) {
+ df <- ddply(df, .(group),
+ function(x) data.frame(year = year(seq(ymd(sdate), ymd(edate), by = "year"))))
+ return(df)
+ }
>
> head(f(df, "1945-1-1", "2013-1-1"))
group year
1 1 1945
2 1 1946
3 1 1947
4 1 1948
5 1 1949
6 1 1950
这就是范围界定的问题。 以下是一个解决方法:
> f <- function(df, sdate, edate) {
+ df <- ddply(df, .(group),
+ function(x) data.frame(year = year(seq(ymd(sdate), ymd(edate), by = "year"))))
+ return(df)
+ }
>
> head(f(df, "1945-1-1", "2013-1-1"))
group year
1 1 1945
2 1 1946
3 1 1947
4 1 1948
5 1 1949
6 1 1950
另一种选择是将do.call与调用一起使用,以便在sdate和edate可见的环境中构造调用:
f <- function(df, sdate, edate) {
df <- do.call("ddply",list(df, "group", transform,
year = call("year",x= seq(ymd(sdate),
to = ymd(edate), by = "year"))))
return(df)
}
f(df, "1945-1-1", "2013-1-1")
group year
1 1 1945
2 1 1946
3 1 1947
4 1 1948
5 1 1949
6 1 1950
7 1 1951
8 1 1952
另一种选择是将do.call与调用一起使用,以便在sdate和edate可见的环境中构造调用:
f <- function(df, sdate, edate) {
df <- do.call("ddply",list(df, "group", transform,
year = call("year",x= seq(ymd(sdate),
to = ymd(edate), by = "year"))))
return(df)
}
f(df, "1945-1-1", "2013-1-1")
group year
1 1 1945
2 1 1946
3 1 1947
4 1 1948
5 1 1949
6 1 1950
7 1 1951
8 1 1952