针对所有变量调用R函数

时间:2019-03-18 14:12:10

标签: r function

我必须对数据框中的所有变量运行一个函数,基本上将风向以度为单位更改为风向名称。我编写了一个函数,如果我给它单独的值,但不能对整个数据框架起作用,那么该函数将起作用。

这是我的功能:

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"

在调用函数后,我要用整个数据帧而不是用度数名称来更新整个数据框-

如何使其正常工作?

3 个答案:

答案 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, ]))
}