1

我正在尝试将一个函数应用于数据帧 M 的所有 334 行,其中包含时间和位置数据,并为每一行获取一个值。相反,我得到每行 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)
4

1 回答 1

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
于 2012-07-09T18:25:21.503 回答