我想在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岁。
有人可以帮我解决问题吗?
答案 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)
一旦纠正了数据框,就应该解决这个问题。