2014-08-28 92 views
1

我在R中使用mtcars数据集。我有一个数据帧列表(mtcars数据集分为多个柱面)。我需要:For循环数据帧列表

  1. 确定每个汽缸类型(即4,6,8)内汽车的最小值,以英里/加仑(mpg)为单位。
  2. 创建一个存储步骤1中找到的每辆汽车的马力(hp)值的矢量(矢量的长度为3)。

步骤I迄今进行的,如下所示:

# load the data 
data(mtcars) 

# split cars data.frame into a list of data frames by cylinder 
cars <- split(mtcars, mtcars$cyl)  

# find the position within each data frame for the min values of mpg (i.e. first 
# column) 
positions <- sapply(cars,function(x) which.min(x[,1])) 

正如我看到的那样,下一个步骤将是使一个循环在每个数据帧以找到每个位置上的马力值。我试图为此做一个For循环,但是我一直无法使它工作。也许这个问题甚至有更好的解决方案。

+0

请注意@bstockton在答案评论中指出了一些重要的内容。在8cyl类别中有两辆车共享最小值。 – 2014-08-29 06:39:44

回答

4

你不需要split的数据,然后使用sapply。有很多方法可以使用更有效的方法来达到该输出。以下是可能的解决方案data.table

mtcars$Cars <- rownames(mtcars) 
library(data.table) 
data.table(mtcars)[, list(Car = Cars[which.min(mpg)], 
          HP = hp[which.min(mpg)]), 
        by = cyl] 

# cyl    Car HP 
# 1: 6   Merc 280C 123 
# 2: 4   Volvo 142E 109 
# 3: 8 Cadillac Fleetwood 205 

也许使用dplyr

library(dplyr) 
mtcars %>% 
    mutate(Cars = rownames(mtcars)) %>% 
    group_by(cyl) %>% 
    summarize(Car = Cars[which.min(mpg)], HP = hp[which.min(mpg)]) 

# Source: local data frame [3 x 3] 
# 
# cyl    Car HP 
# 1 4   Volvo 142E 109 
# 2 6   Merc 280C 123 
# 3 8 Cadillac Fleetwood 205 
+0

这真是太棒了!谢谢 – Victor 2014-08-28 22:37:23

+2

在8缸类别中,有两辆车的MPG最小值相同。 – bstockton 2014-08-28 23:22:11

1

从预先分割的cars组合中,您可以使用MapReduce这种方式进行此操作。

> Reduce(rbind, 
     Map(function(x) x[which.min(x$mpg), "hp", drop = FALSE], 
      cars, USE.NAMES = FALSE) 
     ) 
        hp 
# Volvo 142E   109 
# Merc 280C   123 
# Cadillac Fleetwood 205 

如果你想要一个载体,可以将上面的代码分配给一个变量,说rr,做

> setNames(rr[,1], rownames(rr)) 
#  Volvo 142E   Merc 280C Cadillac Fleetwood 
#    109    123    205 
1

这是很容易,如果你使用plyr库。这里亚去:

library(plyr) 
data(mtcars) 

mpMins <- ddply(mtcars, .(cyl),summarize, min = min(mpg), .drop = FALSE) 
mpMins 

    cyl min 
1 4 21.4 
2 6 17.8 
3 8 10.4 

此只给你哩的最小值,虽然,你想要的马力太

hpMins <- (merge(mpMins, mtcars, by.x = c("min","cyl"), by.y = c("mpg","cyl")))$hp 
hpMins 
[1] 205 215 123 109 

奇怪,有四个值。你说你想要三个。如果您返回并检查数据,则对于8缸类别,有两个最小值10.4。记住要在汇总值(如最小值)到个别观察值时要小心。