用于循环数据框列表

时间:2014-08-28 21:38:33

标签: r for-loop

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

  1. 识别每种气缸类型中每加仑英里数(mpg)的最小值(即4,6,8)。
  2. 创建一个矢量,存储步骤1中找到的每辆汽车的马力(hp)值(矢量长度为3)。
  3. 到目前为止我执行的步骤如下:

    # 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循环,但我还没有能够使它工作。也许有更好的解决方案解决这个问题。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 

答案 2 :(得分: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

这只会给你mpg的最小值,你也想要马力

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

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