我必须对数据框中的所有变量运行一个函数,基本上将风向以度为单位更改为风向名称。我编写了一个函数,如果我给它单独的值,但不能对整个数据框架起作用,那么该函数将起作用。
这是我的功能:
compute_aggregate_wind_dir <- function(wind_dir) {
if(wind_dir >= 0 && wind_dir <= 45) {
wind_dir = 'N' } else if(wind_dir > 45 && wind_dir <= 90) {
wind_dir = 'NE' } else if(wind_dir > 90 && wind_dir <= 135) {
wind_dir = 'E' } else if(wind_dir > 135 && wind_dir <= 180) {
wind_dir = 'SE' } else if(wind_dir > 180 && wind_dir <= 225) {
wind_dir = 'S' } else if(wind_dir > 225 && wind_dir <= 270) {
wind_dir = 'SW' } else if(wind_dir > 270 && wind_dir <= 315) {
wind_dir = 'W' } else {
wind_dir = 'NW' }
wind_dir
}
这是我的数据框:
wind_direction <- data.frame(
wind_dir = c(0,51,95,229,175)
)
# Print the data frame.
print(wind_direction)
这是我如何调用它来更新数据框中的方向:
wind_direction = compute_aggregate_wind_dir(wind_dir)
当我打印结果时,它仅打印西北。
> print(wind_direction)
wind_dir
1 0
2 51
3 95
4 229
5 175
> wind_direction = compute_aggregate_wind_dir(wind_dir)
> wind_direction
[1] "NW"
在调用函数后,我要用整个数据帧而不是用度数名称来更新整个数据框-
如何使其正常工作?
答案 0 :(得分:3)
由于这些是连续值,我建议在这里使用cut
并给出适当的labels
compute_aggregate_wind_dir <- function(x) {
cut(x, breaks = c(-Inf, 45, 90, 135, 180, 225, 270, 315, Inf),
labels = c("N", "NE", "E", "SE", "S", "SW", "W", "NW"))
}
compute_aggregate_wind_dir(wind_direction$wind_dir)
#[1] N NE E SW SE
,如果要更新多个列,则可以使用lapply
并更新数据框。
wind_direction[] <- lapply(wind_direction, compute_aggregate_wind_dir)
答案 1 :(得分:1)
当前函数的主要问题是它使用的是普通if
else
语句,默认情况下不对它们进行向量化。虽然您可以在此处使用基R的ifelse
函数进行矢量化,但更好的方法可能是使用case_when
库中的dplyr
:
library(dplyr)
compute_aggregate_wind_dir <- function(wind_dir) {
case_when(
wind_dir >= 0 && wind_dir <= 45 ~ 'N',
wind_dir <= 90 ~ 'NE',
wind_dir <= 135 ~ 'E',
wind_dir <= 180 ~ 'SE',
wind_dir <= 225 ~ 'S',
wind_dir <= 270 ~ 'SW',
wind_dir <= 315 ~ 'W',
TRUE ~ 'NW'
)
}
答案 2 :(得分:0)
您可以使用for
循环对数据框中的每个值进行迭代。
此代码如下所示,并打印所有风向:
for (i in 1:nrow(wind_direction)) {
print(compute_aggregate_wind_dir(wind_direction[i, ]))
}