在R中应用包moonsun的功能

时间:2012-07-09 17:34:18

标签: r apply

我正在尝试将一个函数应用于所有334行数据帧M,其中包含时间和位置数据,并为每一行获取一个值。相反,我得到每行334个值的列表。如何根据同一行的变量值计算每行一个值?

这些是数据框M的头部和尾部:

d mo    y   lat  long
 5  6 2007    NA    NA
 6  6 2007    NA    NA
 7  6 2007    NA    NA
 8  6 2007 26.89 15.53
 9  6 2007 28.00 15.73
10  6 2007 22.41 14.93
...
26  4 2008 23.86 14.05
27  4 2008 24.12 14.34
28  4 2008 27.75 12.87
29  4 2008 27.28 10.91
30  4 2008 24.17 14.44
1  5 2008    NA    NA

我的代码:

f1 = function(x){
         options(latitude= M$lat, longitude= M$long); 
         as.lt(moon.rst(jday = jd(M$y,M$mo,M$d)))
}
M$rs <- apply(M, 1, f1)

1 个答案:

答案 0 :(得分:2)

f1  <- function(d, mo, y, lat, long){
  options(latitude = lat, longitude = long)
  as.lt(moon.rst(jday = jd(y, mo, d)))
}
data$rs <- do.call(f1, data)
Warning message:
In if (year < 0) c = floor((365.25 * year) - 0.75) else c = floor(365.25 *  :
  the condition has length > 1 and only the first element will be used
data
   d mo    y   lat  long     rs.rise  rs.transit      rs.set
1  8  6 2007 26.89 15.53  0h 24m 30s  5h 42m  2s 11h 42m 13s
2  9  6 2007 28.00 15.73  1h  4m 42s  6h 34m  5s 12h 46m 30s
3 10  6 2007 22.41 14.93  1h 54m 38s  7h 31m  8s 13h 53m 59s

函数jd()发出警告,因为我们传递向量(在本例中为year)作为参数,但尽管如此,我希望这是您需要的结果。

编辑:没有任何警告的另一个版本,使用apply,但使用索引,我认为do.call更快。

f1 <- function(M){
  options(latitude= M[4], longitude= M[5]); 
  as.lt(moon.rst(jday = jd(M[3],M[2],M[1])))
}
apply(data[,c('d','mo','y','lat','long')], 1, f1)
[[1]]
                  rise     transit         set
2005-06-08  6h  2m 30s 13h  8m  3s 20h 12m 51s

[[2]]
                  rise     transit         set
2005-06-09  6h 55m 34s 14h  1m 26s 21h  4m 44s

[[3]]
                  rise     transit         set
2005-06-10  8h  7m 41s 14h 57m  7s 21h 43m 36s