我正在尝试将一个函数应用于所有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)
答案 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