在R中制定一个函数

时间:2015-10-24 07:31:31

标签: r

我想在R中创建这个函数:

  

get_mpg():给定汽车名称,速度类型和汽车数据框,此函数返回相应的燃油消耗值(即每加仑英里数)。

这就是我拥有的所有数据:

car_names <- c("mazda3", "civic", "focus", "prius", 
    "a6quattro", "tacoma", "camaro", "challenger")
speed <- c("city", "hwy")
mpg <- c(30, 41, 31, 41, 29, 40, 53, 46, 18, 
        28, 17, 21, 16, 24, 14, 23)
cars <- data.frame(car = car_names, speed = speed, mpg = mpg)

我写的函数是:

    get_mpg <- function(car_names, speed, frame)
    {
          subset_mpg <- subset(frame, 
                  cars == car_names, speed == speed)
          return(as.numeric(subset_mpg[, 3]))
    }

但是当我在做的时候

get_mpg("a6quattro", "hwy", cars)

我得到29 16而我应该只得到28岁。

有人可以帮我解决问题吗?

2 个答案:

答案 0 :(得分:4)

这里有几个问题:

1。)你没有和#34; a6quattro&#34;和&#34; hwy&#34;所以,你应该期待没有数据返回。

2。)使用modf(double, double*)导致电视剧正在subset正在比较speed==speed而不是frame$speed==frame$speed - 建议不要将frame$speed==speed用于非出于这个原因的交互编码目的。

3。)您需要将您的选择与subset合并,而不是用&中的逗号分隔它们。

4。)相反,使用类似的东西:

subset

答案 1 :(得分:2)

问题可能是您的数据框架不是您期望的那样。这是您的数据框的样子:

> car_names <- c("mazda3", "civic", "focus", "prius", "a6quattro", "tacoma", "camaro", "challenger")
> speed <- c("city", "hwy")
> mpg <- c(30, 41, 31, 41, 29, 40, 53, 46, 18, 28, 17, 21, 16, 24, 14, 23)
> carsx <- data.frame(car = car_names, speed = speed, mpg = mpg)
> carsx
          car speed mpg
1      mazda3  city  30
2       civic   hwy  41
3       focus  city  31
4       prius   hwy  41
5   a6quattro  city  29
6      tacoma   hwy  40
7      camaro  city  53
8  challenger   hwy  46
9      mazda3  city  18
10      civic   hwy  28
11      focus  city  17
12      prius   hwy  21
13  a6quattro  city  16
14     tacoma   hwy  24
15     camaro  city  14
16 challenger   hwy  23

正如您所看到的,每辆车都没有为&#34; city&#34;和&#34; hwy&#34;。例如,mazda3获得了两个&#34; city&#34 ;;思域得到了两个&#34; hwy&#34;的实例。有问题的汽车a6quattro有两个&#34; city&#34;并且没有&#34; hwy&#34;,这可能是造成行为不端的子集的原因。

如果使用&#34; [&#34;如下所示,您得到正确的答案(因为数据不正确,所以什么也得不到)。

#You can replace "a6quattro" and "hwy" with arguments passed to a function
carsx[carsx$car == "a6quattro" & carsx$speed == "hwy", "mpg"]
numeric(0)

一旦纠正了数据框,就应该解决这个问题。